【问题标题】:How to load into Globals in Python from a function如何从函数加载到 Python 中的全局变量
【发布时间】:2016-11-14 17:55:12
【问题描述】:

我有一个将数据加载到字典中的函数。 但是,我怎样才能将字典加载到 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

这个不起作用(全局变量是模块/函数的本地...)

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

【问题讨论】:

    标签: python python-2.7 memory pickle


    【解决方案1】:

    您确实应该将这些名称存储在存储在全局中的对象上,而不是作为全局变量。但是你问了怎么做,所以这里是如何做的:

    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。在 Python 2.7.3 中测试。

    【讨论】:

    • 听起来不错,你是 python 大师。为什么我应该将这些名称存储到一个对象而不是 Globals 中? (这是为了在加载数据后运行脚本)
    猜你喜欢
    • 1970-01-01
    • 2014-03-30
    • 2012-05-22
    • 2020-03-21
    • 2018-03-14
    • 1970-01-01
    • 2013-05-06
    相关资源
    最近更新 更多