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