如何避免使用完全限定名称的python中的查找开销,以避免循环导入问题

时间:2017-06-05 11:55:07

标签: python import circular-dependency

为避免循环导入,可以使用import x,然后每次都使用x.func。 (参见Circular (or cyclic) imports in Python)。 (就我而言,我实际上别无选择)

但是,当x例如a.b.c.d.e时,您会得到一个不可忽略的开销(除了可读性问题),特别是如果您的函数被重复调用。我想知道在解决导入时是否存在某种机制来定义E = a.b.c.d.e之类的快捷方式? (或者每次都要避免查找的内容)

注意:在pypy上,没有性能差异,但在CPython上,a.A()a.b.c.d.e.f.g.h.A()之间可以获得×2的改善

修改 关于import ... as ...解决方案, 这是我得到的痕迹(我认为它比我能给出的任何解释更清晰):

  File "MyApp/__init__.py", line 3, in <module>
    import MyApp.core
  File "MyApp/core.py", line 3, in <module>
    import MyApp.formatters.ASCIIFormatter as _F
  File "MyApp/formatters/__init__.py", line 2, in <module>
    import MyApp.formatters.ASCIIFormatter as ASCIIFormatter
  File "MyApp/formatters/ASCIIFormatter.py", line 2, in <module>
    import MyApp.core as _C
AttributeError: module 'MyApp' has no attribute 'core'

1 个答案:

答案 0 :(得分:0)

您可以在导入模块时设置别名:

import a.b.c.d.e as E

您发布的代码也可以使用,但它并不漂亮:

import a.b.c.d.e
E = a.b.c.d.e