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'を使用すると、現在のモジュールでのみ機能するという問題があります。'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 に答える