質問
ここから次のコードを使用したかった:現在の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()
しかし、それは次のエラーを与えます:
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'
助けてくれませんか?
ありがとう!
解決
Tracebackから、関数内からそのコードを実行しようとしているようです。
しかし dir
の名前を調べます 現在のローカルスコープ. 。だから filename
関数内で定義されています、それは locals()
それよりも globals()
.
あなたはおそらくこのようなものが欲しいです:
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()
その時に注意してください globals()
から呼ばれます 内部 関数、それは関数があるモジュールから変数を返します 定義されています, 、それがどこから来たのかではありません 呼び出されました.
だから save_variables
関数がインポートされ、からの変数が必要です 現在 モジュール、次のことを行います。
save_variables(globals())
所属していません StackOverflow