Python 3.x setattr不遵守属性命名约定
前几天我遇到了一个奇怪的遭遇,下面的代码:Python 3.x setattr不遵守属性命名约定,python-3.x,attributes,naming-conventions,setattr,Python 3.x,Attributes,Naming Conventions,Setattr,前几天我遇到了一个奇怪的遭遇,下面的代码: class Obj: pass obj = Obj() setattr(obj, '@#^&%$&', None) 实际上起了作用。如果以下情况引发syntaxerror,为什么允许这种行为 obj.@#&%$&所有的setattr函数所做的就是将给定键处的给定值分配给对象的\uuu dict\uuuu字典。它不会对键进行任何验证,因此您可以使用getattr检索值,如下所示: getattr(obj, '@#^&%$
class Obj:
pass
obj = Obj()
setattr(obj, '@#^&%$&', None)
实际上起了作用。如果以下情况引发syntaxerror,为什么允许这种行为
obj.@#&%$&
所有的setattr
函数所做的就是将给定键处的给定值分配给对象的\uuu dict\uuuu
字典。它不会对键进行任何验证,因此您可以使用getattr
检索值,如下所示:
getattr(obj, '@#^&%$&')
返回指定给所述键的值:
None
但是,点表示法后面的属性名不是带引号的字符串的一部分,因此必须遵循Python命名语法,否则解释器无法正确解析它。它可以工作,因为它大致相当于写入:
obj.\uu dict\['@#^&%$&']=None
。但这并不正确;)