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?
Umożliwia także kreski i większość innych znaków nieważnych jako atrybuty bezpośrednie. –
Rzeczywiście. Nazwa atrybutu jest po prostu ciągiem, który klawisza dyktuje. –