2017-02-09 60 views
1

假設我們在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語法爲前導空格分配變量。

爲什麼允許這樣做?

+3

沒有第二任何前導空格案件。解析器忽略空格 –

回答

3

在第二種情況下沒有任何空格,因爲在分配階段,空格在分配完成之前全部被丟棄。

考慮到Python的可讀性強調,這可以例如允許在多個線路運行(斷行點後),還有工作代碼:

>>> str. \ 
... lower 
<method 'lower' of 'str' objects> 
相關問題