代码之家  ›  专栏  ›  技术社区  ›  Paul Knopf

使用“as”时,Python循环引用导入不起作用

  •  1
  • Paul Knopf  · 技术社区  · 7 年前

    让我首先确定工作场景。

    main.py
    module/file1.py
    module/file2.py
    

    主要的py公司

    import module.file1
    print(module.file1)
    

    模块/文件1。py公司

    import module.file2
    

    模块/文件2。py公司

    import module.file1
    

    跑步 python3 main.py 给我以下信息,这很好。

    <module 'module.file1' from '/project/module/file1.py'>
    

    现在,如果我改变 模块/文件2。py公司 具备以下条件:

    import module.file1 as testtt
    

    我获得此新输出(错误):

    Traceback (most recent call last):
      File "main.py", line 1, in <module>
        import module.file1
      File "/project/module/file1.py", line 1, in <module>
        import module.file2
      File "/project/module/file2.py", line 2, in <module>
        import module.file1 as testtt
    AttributeError: module 'module' has no attribute 'file2'
    

    我猜python在简单导入时并没有完全评估导入的模块,导致循环引用只有在您立即在两个文件中的任何一个文件中使用时才会爆炸。

    我可以想象,如果在函数中使用该模块,我也不会得到错误,因为当函数实际被调用时,这将被求值,如下所示:

    import module.file1
    
    def test():
        print(module.file1)
    

    这里有什么建议?我是否应该删除循环引用?不管怎么说,这似乎是代码的味道(现有的代码库)。

    2 回复  |  直到 7 年前
        1
  •  2
  •   tdelaney    7 年前

    这是一个实现细节。这个 import 语句使用 __import__ 函数执行查找和导入模块的工作,然后将其返回的模块绑定到 as testtt 变量

    执行嵌套导入时,如 import module.file1 as testtt ,则, __导入__ 返回基本模块(“模块”)。由于导入器仍然需要将“file1”绑定到本地名称空间,因此它必须在该对象上查找子模块名称“file1”。由于file1的导入仍在进行中,因此尚未将其绑定到“模块”模块。

    它在 import module.file1 案例原因 file1 未绑定到本地命名空间,不需要查找。

    循环导入存在许多陷阱,这些陷阱将在代码的整个生命周期中困扰您。祝你好运

        2
  •  1
  •   Chris Curvey    7 年前

    “import”是一个可执行语句,因此您只需在函数内部进行导入即可

    def test():
        import module.file1
        print(module.file1)