Circular (or cyclic) imports in Python

前端 未结 12 2361
醉梦人生
醉梦人生 2020-11-21 05:23

What will happen if two modules import each other?

To generalize the problem, what about the cyclic imports in Python?

12条回答
  •  温柔的废话
    2020-11-21 05:33

    Cyclic imports terminate, but you need to be careful not to use the cyclically-imported modules during module initialization.

    Consider the following files:

    a.py:

    print "a in"
    import sys
    print "b imported: %s" % ("b" in sys.modules, )
    import b
    print "a out"
    

    b.py:

    print "b in"
    import a
    print "b out"
    x = 3
    

    If you execute a.py, you'll get the following:

    $ python a.py
    a in
    b imported: False
    b in
    a in
    b imported: True
    a out
    b out
    a out
    

    On the second import of b.py (in the second a in), the Python interpreter does not import b again, because it already exists in the module dict.

    If you try to access b.x from a during module initialization, you will get an AttributeError.

    Append the following line to a.py:

    print b.x
    

    Then, the output is:

    $ python a.py
    a in                    
    b imported: False
    b in
    a in
    b imported: True
    a out
    Traceback (most recent call last):
      File "a.py", line 4, in 
        import b
      File "/home/shlomme/tmp/x/b.py", line 2, in 
        import a
     File "/home/shlomme/tmp/x/a.py", line 7, in 
        print b.x
    AttributeError: 'module' object has no attribute 'x'
    

    This is because modules are executed on import and at the time b.x is accessed, the line x = 3 has not be executed yet, which will only happen after b out.

提交回复
热议问题