2013-02-08 10 views
9

だが、私はこのクラスを定義しましょう:setattrとgetattrが空白を許可するのはなぜですか?

class A: 
    pass 

a = A() 

は今、明らかに私はそうのような属性を設定することができます

a.x = 5 

しかしsetattrで、私は自分の名前に空白文字が含まれているa属性を与えることができます。

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

dir(a)'white space''new\nline'が含まれています。

それはSyntaxErrorを上げるので、私は、.演算子を使用して、これらの属性にアクセスすることはできません。getattr

>>> 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 
をしかし、私は次のことができます。

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

この機能の背後にある理由はありますか?もしそうなら、それは何ですか?

これを使用するか、PEP8で定義されている基準に準拠する必要がありますか?

答えて

8

オブジェクト属性は、オブジェクトの__dict__で定義された属性に過ぎません。そのような観点から考えると、空白(またはstrに含めることができる他の任意の文字)を属性名に使用できるようにすると、意味があります。

インタプリタがどのようにプロパティトークン化(パース)のプログラムソースを知らないので、Pythonの言語の構文は、直接属性参照に空白を可能にすることができない、と述べた
>>> class X(object): 
... pass 
... 
>>> x = X() 
>>> setattr(x, 'some attribute', 'foo') 
>>> x.__dict__ 
{'some attribute': 'foo'} 
>>> x.__dict__['some attribute'] 
'foo' 

。私はattribute namesを使用することに固執しています。これは、直接属性を参照することでアクセスできます。

+1

また、直接属性として有効でないダッシュやその他の文字も使用できます。 –

+2

確かに。属性名は、dictをキーする文字列です。 –

関連する問題