Does Python import statement also import dependencies automatically?

前端 未结 2 2104
傲寒
傲寒 2020-12-19 05:28

I have the following file app.py

class Baz():
    def __init__(self, num):
        self.a = num
        print self.a

def foo(num):
    obj = Ba         


        
2条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-19 05:55

    As @DavidZ already mentioned the whole Python file gets compiled when we import it. But another special thing happens when a function body is parsed, a function knows which variables it should look for in local scope and which variables it should look for in global scope(well there are free variables too).

    >>> import dis
    >>> dis.dis(foo)
      7           0 LOAD_GLOBAL              0 (Baz)
                  3 LOAD_FAST                0 (num)
                  6 CALL_FUNCTION            1
                  9 STORE_FAST               1 (obj)
                 12 LOAD_CONST               0 (None)
                 15 RETURN_VALUE
    

    So, here Baz must be fetched from global scope.

    But how to identify this global scope when we import app.py in another file?

    Well, each function has a special attribute __globals__ attached to it which contains its actual global namespace. Hence, that's the source of Baz:

    >>> foo.__globals__['Baz']
    
    

    So, app's module dictionary and foo.__globals__ point to the same object:

    >>>sys.modules['app'].__dict__ is foo.__globals__ 
    True
    

    Due to this even if you define another variable named Baz in main.py after importing foo it will still access the actual Baz.

    From data-model page:

    __globals__ func_globals:

    A reference to the dictionary that holds the function’s global variables — the global namespace of the module in which the function was defined.

提交回复
热议问题