如何从函数加载到Python中的Globals

2024-06-16 10:46:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数,可以将数据加载到字典中。 但是,如何将dictionary加载到函数中的Globals()

函数内部的很重要,因为我们可以在脚本外部轻松地完成它。你知道吗

def load237(filename):
    filename = osp.abspath(filename)
    old_cwd = os.getcwdu()
    os.chdir(osp.dirname(filename))
    error_message = None
    try:
        tar = tarfile.open(filename, "r")
        tar.extractall()
        pickle_filename = osp.splitext(filename)[0]+'.pickle'
        data = cPickle.load(file(pickle_filename))
        saved_arrays = {}
        if load_array is not None:
            try:
                saved_arrays = data.pop('__saved_arrays__')
                for (name, index), fname in saved_arrays.iteritems():
                    arr = np.load( osp.join(osp.dirname(filename), fname) )
                    if index is None:
                        data[name] = arr
                    elif isinstance(data[name], dict):
                        data[name][index] = arr
                    else:
                        data[name].insert(index, arr)
            except KeyError:
                pass
        for fname in [pickle_filename]+[fn for fn in saved_arrays.itervalues()]:
            os.remove(fname)
    except (EOFError, ValueError), error:
        error_message = unicode(error)
    os.chdir(old_cwd)
    return data, error_message

这个不起作用(globals是模块/函数的本地…)

def load_inmemory(fpath):
      globals().update(load237(fpath)[0])

Tags: 函数namemessagedataindexosloaderror
1条回答
网友
1楼 · 发布于 2024-06-16 10:46:41

实际上,应该将这些名称存储在全局变量中而不是作为全局变量存储的对象上。但是你问了怎么做,下面是怎么做的:

Getting corresponding module from functionfor循环和setattr用作模块不支持字典操作,可以将函数编写为:

import sys

def load_inmemory():
    module = sys.modules[load_inmemory.__module__]
    for k, v in load237(fpath)[0].items():
        setattr(module, k, v)

load_inmemory()
print x

我测试了以下内容:

import sys

def func():
      module = sys.modules[func.__module__]
      for k,v in {'x':4}.items():
         setattr(module, k, v)

func()
print x

打印4。在Python2.7.3中测试。你知道吗

相关问题 更多 >