2016-11-14 8 views
0

私は、データを辞書にロードする関数を持っています。 しかし、どのようにして関数内のグローバル()のに辞書をロードできますか?関数からPythonでグローバルにロードする方法

は、スクリプトの外側で簡単に行うことができるので、重要です。

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 

この1つは動作しません(グローバルを...モジュール/関数に対してローカルである)

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

答えて

0

あなたは本当に、グローバルグローバルずに格納されているオブジェクトの上にそれらの名前を格納する必要があります変数。しかし、あなたはそれを行う方法を尋ねたので、ここでどのようにです:

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 

I:のように関数を記述することが可能であるforループと辞書の操作をサポートしていないモジュールなどsetattrGetting corresponding module from functionを使用して

と以下をテストしました。

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でテストされています。

+0

いいですね、あなたはパイソンマスターです。 なぜこれらの名前をオブジェクトに格納し、グローバルに格納しないといけませんか? (これは、データをロードした後にスクリプトを実行するためのものです) – Brook

関連する問題