在代码中加载模块的位置是否重要? 或者它们都应该在顶部声明,因为在加载时,外部模块必须加载,无论它们在代码中声明的位置......?
示例:
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)
答案 0 :(得分:10)
This表示它可能有所作为:
“import语句几乎可以在任何地方执行。将它们置于函数内以限制其可见性和/或缩短初始启动时间通常很有用。虽然Python的解释器已经过优化,无法导入模块多次,重复执行import语句会严重影响某些情况下的性能。“
这两个操作系统问题local import statements?和import always at top of module?详细讨论了这个问题。
最后,如果您对特定的案例感到好奇,可以在您的环境中对您的两个备选方案进行概述/基准测试。
我更喜欢将所有的import语句放在源文件的顶部,遵循样式约定并保持一致性(此外,它还可以使更改更容易,无需查找源文件,查找分散在各处的import语句)
答案 1 :(得分: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()
...
理想情况下,您可以设计类,使其永远不会出现,甚至可能将它们包含在同一个模块中。在那个玩具示例中,每个导入另一个真的没有意义。但是,在实践中,在某些情况下,在方法本身中包含一个方法的导入更有意义,而不是将所有内容都放入同一个模块中,或者将有问题的方法提取到其他对象中。
但是,除非你有充分的理由偏离,否则我会说顶级模块惯例。