为什么从属性名称的开头剥离前导空格?

时间:2017-02-09 10:49:46

标签: python naming-conventions

假设我们在Python 2.7或3.5中有一个虚拟类。我们想为一个实例分配一些属性:

>>> class X(object):
...     pass
... 
>>> x = X()

让我们使用setattr()设置一个带前导空格的变量:

>>> setattr(x, '               foo', 'bar')
#               ^^^^^^^^^^^^^^^^^^
>>> x.__dict__
{'               foo': 'bar'}
# ^^^^^^^^^^^^^^^^^^

现在让我们直接分配值,而不是setattr()

>>> x.           hello = 'bye'
#     ^^^^^^^^^^^^^^^^
>>> x.__dict__
{'               foo': 'bar', 'hello': 'bye'}
#                              ^^^^^
#                leading spaces have been removed!

使用instance.attribute = value格式删除前导空格!

这最后一种行为似乎是在PEP 8指示后所需的行为:

  

方法名称和实例变量

     

使用函数命名规则:小写,必要时用下划线分隔,以提高可读性。

然而,我们刚刚看到使用setattr()允许我们绕过这条规则。此外,这使得除非使用getattr(),否则无法获得具有前导空格的属性,因为它无法使用instance.attr = value语法为前导空格分配变量。

为什么允许这样做?

1 个答案:

答案 0 :(得分:3)

在第二种情况下没有任何空格,因为在分析阶段,所有空格都被丢弃,在分配完成之前。

考虑到Python强调可读性,例如,这可以允许跨越多行(在点之后打破行)并且仍然具有可用的代码:

>>> str.    \
... lower
<method 'lower' of 'str' objects>