为什么setattr和getattr允许空格?

时间:2013-02-08 05:20:37

标签: python attributes

假设我定义了这个类:

class A:
    pass

a = A()

现在显然我可以像这样设置属性:

a.x = 5

但是使用setattr,我可以提供名称中包含空格的a个属性。

setattr(a, 'white space', 1)
setattr(a, 'new\nline', None)

dir(a)包含'white space''new\nline'

我无法使用.运算符访问这些属性,因为它会引发SyntaxError

>>> a.white space
  File "<interactive input>", line 1
    a.white space
                ^
SyntaxError: invalid syntax
>>> a.new\nline
  File "<interactive input>", line 1
    a.new\nline
              ^
SyntaxError: unexpected character after line continuation character

但我可以getattr

>>> getattr(a, 'white space')
1
>>> getattr(a, 'new\nline')
None

这个功能背后有原因吗?如果是这样,它是什么?

我们应该使用这个,还是符合PEP8中定义的标准?

1 个答案:

答案 0 :(得分:10)

对象属性仅仅是对象__dict__中定义的那些属性。如果从这个角度考虑它,那么在属性名称中允许空格(或可以包含在str中的任何其他字符)都是完全合理的。

>>> class X(object):
...  pass
... 
>>> x = X()
>>> setattr(x, 'some attribute', 'foo')
>>> x.__dict__
{'some attribute': 'foo'}
>>> x.__dict__['some attribute']
'foo'

也就是说,Python的语言语法不允许直接属性引用中的空格,因为解释器不知道如何对程序源进行属性标记化(解析)。我坚持使用可以通过直接属性引用访问的attribute names,除非你绝对需要这样做。