Обычный метод доступа к атрибутам требует, чтобы имена атрибутов были valid python identifiers.Атрибуты, которые не являются допустимыми идентификаторами python
Но атрибуты не должны быть допустимыми идентификаторами Python:
>>> class Thing:
... def __init__(self):
... setattr(self, '0potato', 123)
...
>>> t = Thing()
>>> Thing.__getattribute__(t, '0potato')
123
>>> getattr(t, '0potato')
123
Конечно, t.0potato
остается в SyntaxError
, но атрибут является то, тем не менее:
>>> vars(t)
{'0potato': 123}
Что является причиной это допустимо? Есть ли действительно какой-либо допустимый прецедент для атрибутов с пробелами, пустой строкой, ключевыми словами с поддержкой python и т. Д.? Я думал, что причина в том, что атрибуты были только ключи в объекте/именах Dict, но это не имеет никакого смысла, так как другие объекты, которые являются допустимыми ключами Dict не допускаются:
>>> setattr(t, ('tuple',), 321)
TypeError: attribute name must be string, not 'tuple'
Ответ на вопрос, почему это разрешено, можно найти в ответе @ poke [здесь] (http://stackoverflow.com/a/25477703/2555451).Я не думаю, что ваш вопрос должен быть забит, но потому, что он просит законных случаев использования, когда другой спрашивает, почему это разрешено. – iCodez
Для начала см. Ответ Мартина против Лёвиса в [Python Issue 14029] (http://bugs.python.org/issue14029). Поэтому в основном это зависит от базовой реализации '__setattr__', которая может принимать неидентификаторы. Тем не менее, хотя можно создать '__setattr__', который принимает кортежи, но все равно терпит неудачу при вызове через' setattr'. Таким образом, кажется, что встроенный метод не просто слепо передает свои аргументы методу '__setattr__' объекта. –
Здесь [Guido van Rossum рассматривает] (https://mail.python.org/pipermail/python-dev/2012-March/117441.html) ваш вопрос. –