Python 为什么前导空格从属性名称的开头被去掉?

Python 为什么前导空格从属性名称的开头被去掉?,python,naming-conventions,Python,Naming Conventions,假设我们在Python2.7或3.5中有一个虚拟类。我们希望为实例分配一些属性: >>> class X(object): ... pass ... >>> x = X() 让我们使用setattr()设置一个带前导空格的变量: 现在,让我们直接执行相同的赋值操作,而不使用setattr(): 使用instance.attribute=value格式删除前导空格 这最后一个行为似乎是在出现以下迹象后所期望的: 方法名称和实例变量 使用函数命名规则:

假设我们在Python2.7或3.5中有一个虚拟类。我们希望为实例分配一些属性:

>>> class X(object):
...     pass
... 
>>> x = X()
让我们使用
setattr()
设置一个带前导空格的变量:

现在,让我们直接执行相同的赋值操作,而不使用
setattr()

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

这最后一个行为似乎是在出现以下迹象后所期望的:

方法名称和实例变量

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

然而,我们刚刚看到,使用
setattr()
可以绕过这个规则。此外,这使得除非使用
getattr()
,否则无法获取带前导空格的属性,就像无法使用
instance.attr=value
语法分配带前导空格的变量一样


为什么允许这样做?

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

考虑到Python对可读性的强调,例如,这可以允许跨多行运行(在一个点后断行),并且仍然有工作代码:

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

第二种情况下没有任何前导空格。parsera忽略了空格,因为它是允许的,Python订阅了adagium“”,这意味着Python比其他语言允许更多的空间,并隐含着这样的假设:开发人员不是需要保护自己的孩子。
>>> x.           hello = 'bye'
#     ^^^^^^^^^^^^^^^^
>>> x.__dict__
{'               foo': 'bar', 'hello': 'bye'}
#                              ^^^^^
#                leading spaces have been removed!
>>> str.    \
... lower
<method 'lower' of 'str' objects>