Il codice Shelve fornisce KeyError
Domanda
Volevo usare il seguente codice da qui:Come posso salvare tutte le variabili nell'attuale sessione di Python?
import shelve
T='Hiya'
val=[1,2,3]
filename='/tmp/shelve.out'
my_shelf = shelve.open(filename,'n') # 'n' for new
for key in dir():
try:
my_shelf[key] = globals()[key]
except TypeError:
#
# __builtins__, my_shelf, and imported modules can not be shelved.
#
print('ERROR shelving: {0}'.format(key))
my_shelf.close()
Ma dà il seguente errore:
Traceback (most recent call last):
File "./bingo.py", line 204, in <module>
menu()
File "./bingo.py", line 67, in menu
my_shelf[key] = globals()[key]
KeyError: 'filename'
Mi potete aiutare per favore?
Grazie!
Soluzione
Dal tuo traceback, sembra che tu stia cercando di eseguire quel codice dall'interno di una funzione.
Ma dir
alza gli occhi nomi nel Ambito locale attuale. Quindi se filename
è definito all'interno della funzione, sarà dentro locals()
piuttosto che globals()
.
Probabilmente vuoi qualcosa di più simile a questo:
import shelve
T = 'Hiya'
val = [1, 2, 3]
def save_variables(globals_=None):
if globals_ is None:
globals_ = globals()
filename = '/tmp/shelve.out'
my_shelf = shelve.open(filename, 'n')
for key, value in globals_.items():
if not key.startswith('__'):
try:
my_shelf[key] = value
except Exception:
print('ERROR shelving: "%s"' % key)
else:
print('shelved: "%s"' % key)
my_shelf.close()
save_variables()
Nota che quando globals()
è chiamato da entro la funzione, restituisce le variabili dal modulo in cui si trova la funzione definito, non da dove si trova chiamato.
Quindi se il save_variables
la funzione viene importata e si desidera le variabili da attuale modulo, quindi fai:
save_variables(globals())