El código de Shelve le da a KeyError
Pregunta
Quería usar el siguiente código de aquí:¿Cómo puedo guardar todas las variables en la sesión actual de 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()
Pero da el siguiente error:
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'
¿Puedes ayudarme por favor?
¡Gracias!
Solución
Desde su traza, parece que está tratando de ejecutar ese código desde dentro de una función.
Pero dir
mira los nombres en el alcance local actual. Así que si filename
se define dentro de la función, estará en locals()
más bien que globals()
.
Probablemente quieras algo más como esto:
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()
Tenga en cuenta que cuando globals()
se llama desde dentro de la función, devuelve las variables del módulo donde está la función definido, no de donde está llamó.
Entonces si el save_variables
la función se importa y desea las variables del Actual módulo, luego hacer:
save_variables(globals())