2013-02-08 15 views
9

Powiedzmy, że określenie tej klasy:Dlaczego setattr i getattr zezwalają na odstępy?

class A: 
    pass 

a = A() 

Teraz oczywiście mogę ustawić atrybuty tak:

a.x = 5 

Ale z setattr, mogę dać a atrybuty, które zawierają spacje w ich nazwach.

setattr(a, 'white space', 1) 
setattr(a, 'new\nline', None) 

dir(a) zawiera 'white space' i 'new\nline'.

nie mogę uzyskać dostęp do tych atrybutów za pomocą operatora ., ponieważ podnosi SyntaxError:

>>> a.white space 
    File "<interactive input>", line 1 
    a.white space 
       ^
SyntaxError: invalid syntax 
>>> a.new\nline 
    File "<interactive input>", line 1 
    a.new\nline 
      ^
SyntaxError: unexpected character after line continuation character 

ale mogę z getattr:

>>> getattr(a, 'white space') 
1 
>>> getattr(a, 'new\nline') 
None 

Czy istnieje powód tej funkcjonalności? Jeśli tak, co to jest?

Czy powinniśmy z tego skorzystać, czy przestrzegać standardów określonych w PEP8?

Odpowiedz

8

Atrybuty obiektu to tylko te atrybuty zdefiniowane w obiekcie __dict__. Jeśli myślisz o tym z tej perspektywy, wtedy dozwolona jest biała spacja (lub jakakolwiek inna postać, która może być zawarta w str) w nazwie atrybutu.

>>> class X(object): 
... pass 
... 
>>> x = X() 
>>> setattr(x, 'some attribute', 'foo') 
>>> x.__dict__ 
{'some attribute': 'foo'} 
>>> x.__dict__['some attribute'] 
'foo' 

Powiedział, że składnia języka Python nie może pozwolić na spacji w bezpośrednim odniesieniem atrybutu jako interpreter nie będzie wiedział, w jaki sposób nieruchomość tokenize (parse) źródło programu. Pozostanę przy użyciu attribute names, do którego można uzyskać dostęp poprzez bezpośrednie odniesienie do atrybutu, chyba że absolutnie musisz postąpić inaczej.

+1

Umożliwia także kreski i większość innych znaków nieważnych jako atrybuty bezpośrednie. –

+2

Rzeczywiście. Nazwa atrybutu jest po prostu ciągiem, który klawisza dyktuje. –

Powiązane problemy