0

私は3つのPythonファイルを持っています

one.py、、two.py_three.py

one.py

one.py私が電話 するから

import two as two  
    two.three()

two.py私は持っています

def two():
    "catch the error here then import and call three()"
    import three as three

three.py私は持っています

def three():
    print "three called"

だから当然私は得ています:

AttributeError:'function'オブジェクトに属性'three'がありません

私の質問は:

two.pyエラーをキャプチャしてからインポートthree.pyしてから呼び出す方法はありますthree()か?

__ _ __ _ __ _ _____編集____ __ _ __ _ __ _ __ _V私はそれをのように呼ぶことができます

two().three()

def two():
    import three as three
    return three

しかし、私はそれをそのように呼びたいです:

two.three()

したがって、基本的にはdef two()を自動実行します。

4

2 に答える 2

1

これが私が思いついた解決策です。私はあなたの質問に触発されてこれを理解しようとしたことを告白しますので、私自身はそれを完全には理解していません。魔法はtwo.pyで発生し、のメソッドにアクセスして呼び出す試みthreeは、クラスのメソッドtwoによって処理されます。は、指定されたモジュールを名前(文字列)でインポートするために使用し、インポートされたモジュールを再度呼び出すことでを模倣します。__getattr__method_router__import__from blah import blahgetattr()

one.py

from two import two
two.three()

two.py

class method_router(object):
    def __getattr__(self, name):
        mod = __import__(name)
        return getattr(mod, name)

two = method_router()

three.py

def three():
    print("three called")
于 2013-01-25T00:00:13.640 に答える
0

モジュールを呼び出す場合、呼び出されたモジュールが機能を持っているかどうか、そうでない場合は代替パスをたどることができる方法はありません。属性エラーをキャッチする句を除いて、tryの周りにtwo.three()をラップすることができます。

try:
   two.three()
except AttributeError:
   three.three()
于 2013-01-24T23:59:20.573 に答える