为什么setattr和getattr允许使用空格?

16

假设我定义了这个类:

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个回答

12

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

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

话虽如此,Python的语言语法不允许在直接属性引用中使用空格,因为解释器无法正确地对程序源进行分词(解析)。除非您绝对需要这样做,否则最好使用可以通过直接属性引用访问的属性名称


1
它还允许破折号和大多数其他不作为直接属性有效的字符。 - Jonathan Vanasco
2
确实。属性名只是用作字典键的字符串。 - Loren Abrams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接