2013-02-08 9 views
9

Sagen wir, ich definieren diese Klasse:Warum erlauben setattr und getattr whitespace?

class A: 
    pass 

a = A() 

Jetzt offensichtlich kann ich Attribute gesetzt wie so:

a.x = 5 

Aber mit setattr, ich a Attribute geben kann, die Leerzeichen in ihren Namen enthalten.

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

dir(a) enthält 'white space' und 'new\nline'.

ich diese Attribute mit dem . Operator nicht zugreifen können, weil es eine SyntaxError aufwirft:

>>> 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 

Aber ich kann mit getattr:

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

Gibt es einen Grund für diese Funktionalität? Wenn ja, was ist das?

Sollten wir davon Gebrauch machen oder den in PEP8 definierten Standards entsprechen?

Antwort

8

Objektattribute sind nur die Attribute, die in einem Objekt __dict__ definiert sind. Wenn Sie es aus dieser Perspektive betrachten, dann ist das Zulassen von Leerzeichen (oder eines anderen Zeichens, das in einem str enthalten sein kann) in einem Attributnamen absolut sinnvoll.

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

Das heißt, Syntax Python die Sprache nicht für Leerzeichen in direkten Attribut Referenz erlauben kann als der Dolmetscher nicht wissen, wie tokenize auf Eigentum (Parsing) die Programmquelle. Ich bleibe bei der Verwendung von attribute names, die über direkte Attributreferenz zugegriffen werden kann, es sei denn, Sie müssen unbedingt etwas anderes tun.

+1

Es erlaubt auch Bindestriche und die meisten anderen Zeichen als direkte Attribute nicht gültig. –

+2

In der Tat. Der Attributname ist nur eine Zeichenfolge, die ein Diktat angibt. –

Verwandte Themen