9

在代码中加载模块的位置是否重要?还是应该将它们都声明在顶部,因为在加载期间,无论在代码中声明的位置如何,都必须加载外部模块......?

例子:

from os import popen

try:
    popen('echo hi')
    doSomethingIllegal;
except:
    import logging                   #Module called only when needed?
    logging.exception("Record to logger)

或者编译器是否以与以下方式相同的方式进行了优化:

from os import popen
import logging                      #Module will always loaded regardless

try:
    popen('echo hi')
    doSomethingIllegal;
except:
    logging.exception("Record to logger)
4

2 回答 2

11

表明它可能会有所作为:

“import 语句几乎可以在任何地方执行。将它们放在函数中以限制它们的可见性和/或减少初始启动时间通常很有用。虽然 Python 的解释器经过优化,不会多次导入同一个模块,但重复执行 import 语句可以在某些情况下严重影响性能。”

这两个OS问题,local import语句?始终在模块顶部导入?详细讨论这个问题。

最后,如果您对您的具体案例感到好奇,您可以在您的环境中对您的两个备选方案进行分析/基准测试。

我更喜欢将我所有的导入语句放在源文件的顶部,遵循风格约定和保持一致性(这也将使以后的更改更容易,而不必在源文件中寻找分散在各处的导入语句)

于 2012-05-20T10:42:35.480 回答
2

一般的经验法则是导入应该在文件的顶部,因为这样可以使代码更容易理解,并且可以更容易地确定模块需要什么,而无需遍历所有代码。

Python 风格指南涵盖了一些关于导入外观的基本指南:http: //www.python.org/dev/peps/pep-0008/#imports

但在实践中,有时从特定函数中导入是有意义的。这提出了循环的导入:

# Module 1
from module2 import B

class A(object):
    def do_something(self):
        my_b = B()
        ...

# Module 2
from module1 import A

class B(object):
    def do_something(self):
        my_a = A()
        ...

这不会按原样工作,但您可以通过移动导入来绕过循环:

# Module 1
from module2 import B

class A(object):
    def do_something(self):
        my_b = B()
        ...

# Module 2
class B(object):
    def do_something(self):
        from module1 import A
        my_a = A()
        ...

理想情况下,您会设计这样的类,使其永远不会出现,甚至可能将它们包含在同一个模块中。在那个玩具示例中,让每个导入另一个确实没有意义。然而,在实践中,在某些情况下,在方法本身中包含一个方法的导入更有意义,而不是把所有东西都扔到同一个模块中,或者将有问题的方法提取到其他对象中。

但是,除非你有充分的理由偏离,否则我会说遵循模块顶部的约定。

于 2012-05-20T18:26:55.620 回答