假设我们在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
语法为前导空格分配变量。
为什么允许这样做?
答案 0 :(得分:3)
在第二种情况下没有任何空格,因为在分析阶段,所有空格都被丢弃,在分配完成之前。
考虑到Python强调可读性,例如,这可以允许跨越多行(在点之后打破行)并且仍然具有可用的代码:
>>> str. \
... lower
<method 'lower' of 'str' objects>