我有三个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()
?
的 的 __ _ __ _ __ _ __ _ __ 修改的 _ __ _ __ _ __ < EM> _ __ _ __ _V
我可以这样称呼它:
two().three()
def two():
import three as three
return three
但我想称之为:
two.three()
所以基本上它会自动执行def two():
答案 0 :(得分:1)
这是我提出的解决方案。我承认我受到了你的问题的启发,试图解决这个问题,所以我自己并不完全理解。魔术发生在two.py中,其中three
类的two
方法处理尝试访问然后调用__getattr__
method_router
方法的方法。它使用__import__
按名称(字符串)导入指定的模块,然后通过再次在导入的模块上调用from blah import blah
来模仿getattr()
。
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")
答案 1 :(得分:0)
当您调用模块时,调用的模块无法自行检查它是否具有函数,如果不是,则遵循备用路径。你可以将try.inree()包装在try except子句中,捕获一个属性错误。
try:
two.three()
except AttributeError:
three.three()