2017-02-09 1 views
1

Python 2.7 또는 3.5에 더미 클래스가 있다고 가정 해보십시오. setattr()없이 지금공백 문자의 시작 부분에서 공백 문자가 제거되는 이유는 무엇입니까?

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

의 직접 값을 할당 동일한 기능을 수행 할 수 있습니다 :

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

의 선행 공백 하나 개의 변수를 설정하자하는 setattr()를 사용하여 : 우리는 인스턴스에 일부 속성을 할당 할

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

instance.attribute = value 형식을 사용하면 선행 공백이 제거됩니다!

방법 이름 및 인스턴스 변수

사용 규칙을 명명 기능 : 필요에 따라 밑줄로 구분 된 단어와 소문자를 개선하기 위해 가독성

이 마지막 동작은 원하는 PEP 8 표시로 한 것 같습니다 .

그러나 setattr()을 사용하면이 규칙을 우회 할 수있었습니다. 또한 을 사용하지 않는 한 선행 공백이있는 속성을 가져올 수 없으므로 공백이있는 변수에 instance.attr = value 구문을 할당 할 수 없게됩니다.

왜 허용됩니까?

+3

두 번째에있는 선행 공백이 없습니다 케이스. 공백은 파서에 의해 무시됩니다 –

+2

왜 허용 되었는가에 따라 파이썬은 "[우리 모두는 여기에 성인을 동의하고 있습니다] (https://mail.python.org/pipermail/tutor/2003-October/025932) adagium을 구독합니다. html) "을 의미하며, Python은 다른 언어보다 훨씬 많은 것을 허용합니다. 개발자는 자신을 보호해야하는 어린이가 아니라는 암묵적인 가정을합니다. – Nietvoordekat

답변

3

두 번째 경우에는 구문 분석 단계에서 공백이 모두 무시되기 때문에 할당이 완료되기 전에 공백이 없습니다. 가독성에 파이썬의 중점을 고려

, 예를 들어이 캔 (점 후 라인을 깨는) 여러 줄에 걸쳐 실행하고 여전히 작동 코드를 가질 수 있도록 :

>>> str. \ 
... lower 
<method 'lower' of 'str' objects> 
관련 문제