使范围中的所有变量全局化或将模块导入另一个模块中

时间:2010-09-23 00:01:59

标签: python module initialization global-variables import

我有一个包含两个模块的包。一个是__init__文件,另一个是包的单独部分。如果我尝试from mypackage import separatepart,则运行__init__模块中的代码,这将运行不需要的代码,从而大大减慢了导入速度。单独部分中的代码不会导致任何错误,因此用户应该能够直接导入它而无需导入__init__模块。

由于我无法想办法做到这一点,我认为我应该在__init__文件中包含一个函数,它可以完成所有操作,因此不会直接完成任何操作,但为了做到这一点,我会需要将任何变量设置为全局变量。有没有办法告诉Python所有变量在函数中是全局的,还是不运行__init__模块?

1 个答案:

答案 0 :(得分:1)

据我所知,没有办法指定所有变量都是全局的,但是你可以在模块中导入模块。只是确保你在在顶层没有调用的函数,你在这里玩无限递归,但一个简单的用法应该是安全的。

#module.py

foo = bar = 0 # global

def init()
    import module as m

    m.foo = 1
    m.bar = 2 # access to globals

如果在顶层调用init,那么你有无限递归但听起来这样做的重点是避免这个代码在顶层运行,所以你应该是安全的。 由于您想在__init__.py文件中执行此操作,只需导入包的顶层。

我在散步时发现这里的递归没有问题,因为顶级代码只会在初始导入时运行一次。