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!

È stato utile?

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())
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top