允许Python属性中的特殊字符的原因
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了允许Python属性中的特殊字符的原因,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1992字,纯文字阅读大概需要3分钟。
内容图文
![允许Python属性中的特殊字符的原因](/upload/InfoBanner/zyjiaocheng/796/d882bebf549240d1907512544e81edd6.jpg)
我有点意外地发现你可以使用setattr为对象设置’非法’属性.非法,我指的是使用传统的__getattr__接口无法检索的名称属性.运算符参考.它们只能通过getattr方法检索.
对我而言,这看起来相当令人惊讶,我想知道是否有这样的原因,或者它是否只是被忽略的东西等等.由于存在用于检索属性的运算符,以及setattribute接口的标准实现,我会期望它只允许实际可以正常检索的属性名称.而且,如果您有一些奇怪的理由想要具有无效名称的属性,则必须为它们实现自己的接口.
我是否一个人对这种行为感到惊讶?
class Foo:
"stores attrs"
foo = Foo()
setattr(foo, "bar.baz", "this can't be reached")
dir(foo)
这会返回既奇怪又有点误导的东西:
[…’__ weakref__’,’bar.baz’]
如果我想以’标准’方式访问foo.bar.baz,我不能.无法检索它是完全合理的,但设置它的能力令人惊讶.
foo.bar.baz
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Foo' object has no attribute 'bar'
是否只是假设,如果你必须使用setattr来设置变量,你将通过getattr引用它?因为在运行时,这可能并非总是如此,特别是使用Python的交互式解释器,反射等.默认情况下允许这样做似乎很奇怪.
编辑:一个(非常粗略)的例子,我期望看到作为setattr的默认实现:
import re
class Safe:
"stores attrs"
def __setattr__(self, attr, value):
if not re.match(r"^\w[\w\d\-]+$", attr):
raise AttributeError("Invalid characters in attribute name")
else:
super().__setattr__(attr, value)
这不允许我在属性名称中使用无效字符.显然,super()不能在基类Object类上使用,但这只是一个例子.
解决方法:
我认为你的假设属性必须是“标识符”是不正确的.正如您所注意到的,python对象支持任意属性(不仅仅是标识符),因为对于大多数对象,属性存储在实例的__dict__中(这是一个dict,因此支持任意字符串键).但是,为了拥有属性访问操作符,需要限制以这种方式访问??的名称集,以允许生成可以解析它的语法.
Is it simply assumed that, if you have to use setattr to set the variable, you are going to reference it via getattr?
不,我不认为这是假设的.我认为假设是,如果你使用的是引用属性.运算符,然后你知道那些属性是什么.如果你有能力知道这些属性是什么,那么你可能已经控制了它们被称为什么.如果您可以控制它们被调用的内容,那么您可以将它们命名为解析器知道如何处理的内容;-).
内容总结
以上是互联网集市为您收集整理的允许Python属性中的特殊字符的原因全部内容,希望文章能够帮你解决允许Python属性中的特殊字符的原因所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。