Shelve代码出现KeyError错误
我想使用下面的代码,来自这里:
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'
你能帮我吗?
谢谢!
1 个回答
4
从你的错误信息来看,你似乎是在一个函数内部运行那段代码。
但是,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())