Código de Doce da KeyError

Quería usar el siguiente código desde 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  menu() File "./bingo.py", line 67, in menu my_shelf[key] = globals()[key] KeyError: 'filename' 

¿Puedes ayudarme por favor?

¡Gracias!

    Desde su rastreo, parece que está intentando ejecutar ese código desde dentro de una función.

    Pero dir busca nombres en el ámbito local actual . Entonces, si el filename está definido dentro de la función, estará en locals() lugar de 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 se llama a globals() desde la función, devuelve las variables del módulo donde se define la función, no desde donde se llama .

    Por lo tanto, si la función save_variables se importa y desea las variables del módulo actual , entonces haga:

     save_variables(globals())