-1

モジュールを動的にインポートして更新したいと考えています。より効率的な方法は、 abarnet が示唆するimportlibようにandを使用することです。ただし、別の解決策は、 andを使用することです。以下に、文字列に格納されたモジュールをその場で呼び出して使用する方法を示すサンプル スクリプトを示します。ただし、このモジュールを関数で呼び出すと(以下を参照)、機能せず、エラー メッセージが表示されます。これが機能しない理由を指摘するために、新鮮な目が必要です。ありがとう。imp.reload execcompiletestglobal name 'FRUITS' is not defined

module_as_string = """ 
class FRUITS:
    APPLE = "his apple"
    PEAR = "her pear"
class foo(object):
    def __init__(self):
        self.x = 1
    def get_fruit(self):
        return FRUITS.APPLE
_class_name = foo """

def get_code_object():
    return compile(module_as_string, "<string>", "exec")

def test():
    exec(get_code_object())        
    a = eval("_class_name()")
    print(a.get_fruit())

if __name__ == "__main__":

    # below doesn't work
    test()

    # below works
    exec(get_code_object())
    a = eval("_class_name()")
    print(a.get_fruit())

-- 編集: 質問する価値がないと思われる場合は、この質問を改善する方法を教えてください。反対票を投じないでください。ありがとう。

4

1 に答える 1

0

function 内でtestは、FRUIT はローカル変数ですが、直接アクセスすることはできません。にアクセスする FRUITには、追加のコンテナdict_objを に渡す必要がありますexec。これを使用して、そのコンテナから実行されたクラスにアクセスできます。実際の例を以下に示します。

def test():
    dict_obj = {}
    exec(get_code_object(),dict_obj)
    a = dict_obj["_class_name"]()
    print(a.get_fruit())
于 2014-11-22T01:56:50.373 に答える