【问题标题】:what really happen when modules imported?导入模块时到底发生了什么?
【发布时间】:2013-04-21 10:51:29
【问题描述】:

我导入模块的一部分而不是整个点,因为我有兴趣加速我的脚本。

我有一个名为 theFile.py 的文件

def goza():
    print vari
    funct()

vari = "called variable"

def funct():
    print "CALLED FUNCTION"

something_else = 12

我如果在我的主要:

from theFile import goza

然后运行 ​​goza() 它确实具有变量 vari 和函数 fuct。 这意味着如果我导入:

from theFile import goza

它实际上导入了整个模块? 但是唯一容易访问的变量是 goza? 如何按我的预期只导入部分代码? (如果我执行类似 from theFile import goza 并使用 goza 的操作, 那将是一个错误,表示没有变量 vari 和 function func)。

非常感谢!

【问题讨论】:

  • 您在同一行输入了两次from theFile import goza

标签: python python-2.7 python-2.6 python-import


【解决方案1】:

别担心。

我几乎肯定整个模块被编译成字节码,然后读入内存,不管怎样。不同的import 语句仅与将哪些类/函数/变量带入全局范围有关。

所以基本上你什么都不担心。这对脚本性能的影响绝对为零。花时间寻找其他地方的改进。

【讨论】:

  • 不只是编译成字节码 - 模块被完整地执行。您可以通过将顶级 print 语句添加到您的模块来看到这一点。此外,如果它有一个关联的.pyc 文件,它不会被编译(因为它已经被编译了)。
  • @poorsod 如果.py 文件比.pyc 新,则会重新编译。
【解决方案2】:

Python 将始终在导入时执行整个文件,然后在执行结束时模块范围内的那些变量是可导入的。

如果您希望仅在作为脚本运行而不是在导入时执行模块的某些部分,则使用习惯用法:

def main():
    code_here

if __name__ == "__main__":
    main()

def goza():
    print vari
    funct()

def main():
    vari = "called variable"

    def funct():
        print "CALLED FUNCTION"

    something_else = 12

if __name__ == "__main__":
    main()

http://docs.python.org/2/library/main.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多