围绕Python进口的方式?

时间:2012-03-09 01:10:20

标签: python import

很抱歉,如果这是一个非常新手的问题,我只是想知道一件事。

在python中,你的代码被分成多个文件,你怎么能避免在同一件事上大量进口?

说我有2个文件。主要和内容。

主:

import pygame
from pygame.locals import *
pygame.display.init()
blah

内容:

import pygame
from pygame.locals import *
pygame.display.init()
load content and stuff
导入{p> pygame两次,display.init被调用两次。这在其他地方是有问题的。反正有没有解决这个问题,还是只需要导入导入导入?

我能想到的一种情况是:每次导入时都会写入文件的脚本。这样,如果它被导入3次,它会运行3次,因此写入文件3次。

提前致谢!

3 个答案:

答案 0 :(得分:6)

你误解了import的作用。它与include不同。加载的模块是单例,其相应的文件不会被评估两次。

也就是说,构造良好的模块不会对导入产生副作用。这就是if __name__=='__main__'成语的目的。

不要试图“清理”您的进口。从文件中导入您需要使用的所有内容。您可以减少对import *的使用,但这纯粹是为了代码可读性和可维护性。

答案 1 :(得分:3)

你应该避免在导入时发生任何事情(除了,请参阅下面的内容)。 python文件首先是一个模块,所以它可以并且应该被其他python模块使用。如果在python文件的导入阶段“发生”某些事情,那么当该文件由另一个模块导入时,它可能以不合需要的方式发生。

每个模块应该定义要使用的东西:类,函数,常量,并等待其他东西使用它们。


显然,如果导入时没有任何脚本,那么实际上不可能使用任何东西并使其“发生”。对于不直接调用模块的异常情况,有一种特殊的习惯用法。每个python文件都有一个变量__name__,它自动使用导入的模块名称创建。当您从命令行运行脚本时(或者您已经启动它),它没有被导入,并且没有它的名称,因此__name__变量将具有特殊值{{1这表明它是正在执行的脚本。您可以检查此情况并采取相应措施:

"__main__"
# main.py
import pygame
from pygame.locals import *

import content

def init():
    pygame.display.init()

def stuff():
    content.morestuff()

if __name__ == '__main__':
    init()
    stuff()

这样; # content.py import pygame from pygame.locals import * def init(): pygame.display.init() def morestuff(): "do some more stuff" if __name__ == '__main__': init() morestuff() 因此init()只能由用户运行的脚本调用一次。假设已经调用pygame.display.init()的代码被分解为另一个函数,并且根据需要被主脚本调用(无论发生什么)

答案 2 :(得分:0)

import语句应该是声明你正在使用来自另一个模块的东西。它们不应该用于导致某些事情发生(比如写入文件)。正如Francis Avila所指出的,Python无论如何都会尝试不再执行模块的代码。

这导致给定的import语句是否会导致任何事情发生,是运行时应用程序的全局属性;你无法从import语句和模块的源代码中分辨出来,因为它取决于项目中其他地方的任何其他代码是否已导入该模块。

因此,在执行模块时“执行某些操作”通常是实现应用程序的一种非常脆弱的方式。但是,“做某事”没有硬性和快速的定义,因为很明显模块需要创建其他模块将从中导入的所有内容,这可能涉及读取配置文件,甚至可能包括编写日志文件或任何数量的其他事情。但是,任何看起来像程序“动作”的东西,而不仅仅是“设置”从模块导入的东西,通常不应该在模块范围内完成。