2

我正在尝试编写一个获取变量名的小函数,检查它是否存在,如果不存在,则将其从文件(使用pickle)加载到全局命名空间。

我尝试在文件中使用它:

import cPickle

#
# Load if neccesary
#
def loadfile(variable, filename):
    if variable not in globals():
        cmd = "%s = cPickle.load(file('%s','r'))" % (variable, filename)
        print cmd
        exec(cmd) in globals()

但它不起作用 - 变量没有被定义。我究竟做错了什么?

4

2 回答 2

2

你总是可以完全避免 exec :


import cPickle

#
# Load if neccesary
#
def loadfile(variable, filename):
    g=globals()
    if variable not in g:
        g[variable]=cPickle.load(file(filename,'r'))


编辑:当然,这只会将全局变量加载到当前模块的全局变量中。

如果你想将这些东西加载到另一个模块的全局变量中,你最好将它们作为参数传入:


import cPickle

#
# Load if neccesary
#
def loadfile(variable, filename, g=None):
    if g is None:
        g=globals()
    if variable not in g:
        g[variable]=cPickle.load(file(filename,'r'))

# then in another module do this
loadfile('myvar','myfilename',globals())

于 2009-05-15T11:37:16.953 回答
2

使用 'globals' 的问题是它只适用于当前模块。与其传递“全局变量”,更好的方法是直接在命名空间上使用“setattr”内置函数。这意味着您可以在实例和模块上重用该功能。

import cPickle

#
# Load if neccesary
#
def loadfile(variable, filename, namespace=None):
    if module is None:
        import __main__ as namespace
    setattr(namespace, variable, cPickle.load(file(filename,'r')))

# From the main script just do:
loadfile('myvar','myfilename')

# To set the variable in module 'mymodule':
import mymodule
...
loadfile('myvar', 'myfilename', mymodule)

注意模块名称:主脚本始终是模块main。如果您正在运行 script.py 并执行“导入脚本”,您将获得代码的单独副本,这通常不是您想要的。

于 2009-05-15T12:36:41.973 回答