Ho un dizionario che a volte riceve le chiamate per i tasti inesistenti, così ho cercare di utilizzare hasattr
e getattr
per gestire questi casi:L'hasattr di Python sui valori di lista dei dizionari restituisce sempre false?
key_string = 'foo'
print "current info:", info
print hasattr(info, key_string)
print getattr(info, key_string, [])
if hasattr(info, key_string):
array = getattr(info, key_string, [])
array.append(integer)
info[key_string] = array
print "current info:", info
La prima volta che questo viene eseguito con integer = 1
:
current info: {}
False
[]
current info: {'foo': [1]}
l'esecuzione di questo codice di nuovo con integer = 2
:
instance.add_to_info("foo", 2)
current info: {'foo': [1]}
False
[]
current info: {'foo': [2]}
La prima esecuzione ha chiaramente successo ({'foo': [1]}
), ma restituisce false e getattr
utilizza la matrice vuota predefinita la seconda volta, perdendo il valore di 1
nel processo! Perchè è questo?
Sarò dannato! Pensavo stavo impazzendo. Ho sempre usato la struttura 'if/in/else' per queste situazioni di test del dizionario con valori predefiniti. Questa volta dal momento che la situazione attuale è in realtà molto più complessa del mio esempio, con pochi altri hasattr che volano in giro, ho preferito quella "sintassi" invece ... che ovviamente non funziona! Mi ricorderò di questo, d'ora in poi, grazie! –
Inoltre, ho a che fare con informazioni in init in modo appropriato, volevo solo semplificare l'esempio. –