Il metodo usuale di accesso agli attributi richiede che i nomi degli attributi siano valid python identifiers.Attributi che non sono identificatori Python validi
Ma attributi non devono essere validi identificatori Python:
>>> class Thing:
... def __init__(self):
... setattr(self, '0potato', 123)
...
>>> t = Thing()
>>> Thing.__getattribute__(t, '0potato')
123
>>> getattr(t, '0potato')
123
Naturalmente, t.0potato
rimane un SyntaxError
, ma l'attributo c'è comunque:
>>> vars(t)
{'0potato': 123}
Qual è la ragione per questo è ammissibile? Esiste davvero un caso d'uso valido per gli attributi con spazi, stringa vuota, parole chiave riservate a Python ecc.? Ho pensato che il motivo era che gli attributi erano solo le chiavi del dict oggetto/spazio dei nomi, ma questo non ha senso, perché gli altri oggetti che sono le chiavi dict valide non sono consentiti:
>>> setattr(t, ('tuple',), 321)
TypeError: attribute name must be string, not 'tuple'
La risposta al motivo per cui questo è consentito può essere trovata nella risposta di @ poke [qui] (http://stackoverflow.com/a/25477703/2555451).Non credo che la tua domanda debba essere duplice, tuttavia, perché richiede casi di uso legittimo laddove l'altro si chiede solo perché questo sia permesso. – iCodez
Per iniziare vedi la risposta di Martin v. Löwis in [numero di Python 14029] (http://bugs.python.org/issue14029). Quindi dipende principalmente dall'implementazione sottostante di '__setattr__' che può accettare non identificatori. Tuttavia, sebbene sia possibile creare un '__setattr__' che accetta le tuple, ma fallisce ancora quando viene chiamato tramite' setattr'. Quindi sembra che il metodo incorporato non si limiti a dare ciecamente i suoi argomenti al metodo '__setattr__' dell'oggetto. –
Ecco [Guido van Rossum considerando] (https://mail.python.org/pipermail/python-dev/2012-March/117441.html) la tua domanda. –