python AttributeError

时间:2013-01-24 23:34:17

标签: python function attributeerror

我有三个python文件

one.pytwo.pythree.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():

2 个答案:

答案 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()