【问题标题】:Does "from-import" exec the whole module?“从导入”是否执行整个模块?
【发布时间】:2009-07-11 22:15:28
【问题描述】:

好的,所以我知道from-importimport“完全”相同,只是这显然不是因为命名空间的填充方式不同。

我的问题主要是因为我有一个 utils 模块,它有一个或两个函数,我的应用程序中的每个其他模块都使用这些函数,我正在努力合并标准库 logging 模块,它作为据我所知,我需要这样做:

import logging
logging.basicConfig(filename="/var/log")  # I want file logging

baselogger = logging.getLogger("mine")
#do some customizations to baselogger

然后要在不同的模块中使用它,我会再次导入日志记录:

import logging
logger = logging.getlogger("mine")

# log stuff

但我想知道的是,如果我执行from utils import awesome_func,我的记录器肯定会被设置,并且记录模块是否会按照我想要的方式设置?

这也适用于其他通用设置。

【问题讨论】:

    标签: python logging import


    【解决方案1】:

    您的问题的答案是肯定的。

    有关导入过程的详细说明,请参阅 Frederik Lundh 的“Importing Python Modules”。

    特别是,我将引用回答您查询的部分。

    Python 如何导入模块?

    [...]

    1. 创建一个新的空模块对象(这本质上是一个字典)
    2. 将该模块对象插入到 sys.modules 字典中
    3. 加载模块代码对象(必要时先编译模块)
    4. 在新模块的命名空间中执行模块代码对象。代码分配的所有变量都可以通过模块对象获得。

    关于from-import的使用:

    有多种方式可以导入模块

    [...]

    from X import a, b, c 导入模块 X,并在当前命名空间中创建对给定对象的引用。或者换句话说,您现在可以在程序中使用 a 和 b 和 c。

    请注意,我省略了一些问题。整个文档都值得一读,其实很短。

    【讨论】:

    • 谢谢,在我提出问题之前,我实际上已经阅读了该内容,但我觉得“从 X 导入 a、b、c”部分并不完全清楚。因为它没有完全按照上面的部分导入模块。但是,根据提供的所有其他证据,它肯定足够接近。
    【解决方案2】:

    看起来答案是肯定的:

    $ echo 'print "test"
    def f1():
        print "f1"
    
    def f2():
        print "f2"
    
    ' > util.py
    
    $ echo 'from util import f1
    f1()
    from util import f2
    f2()
    ' > test.py
    
    $ python test.py 
    test
    f1
    f2
    
    $ 
    

    【讨论】:

    • 谢谢。使用一个非常小的测试日志模块更具体地执行此操作表明它确实正确初始化。
    【解决方案3】:

    是的,from MODULE import OBJECT 执行模块中的所有内容,然后有效地执行OBJECT = MODULE.OBJECT。从某种意义上说,您可以看出该模块已经加载,因为它现在驻留在sys.modules 字典中。

    【讨论】:

      【解决方案4】:

      如上所述,是的。 您可以编写简单的测试来确定:

      # file m.py
      import sys
      
      # define function
      def f():
          pass
      
      #execute this when module is loaded (i.e. imported or run as script)
      print 'imported', __name__
      # print all "exposed" variables to make sure that the f is visible
      print dir(sys.modules[__name__])
      
      # file main.py
      from m import f
      print 'done'
      

      每当您对某些导入或子类化或其他方法的工作方式有疑问时,我建议您编写此类测试。

      【讨论】:

        猜你喜欢
        • 2016-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多