python:我可以在模块本身中导入模块命名空间吗?

时间:2011-08-17 07:13:00

标签: python scope python-module

由于变量名称在函数中有赋值给它们,并且我想从函数中访问模块变量,因此我可以在模块中导入模块名称,然后使用它来访问模块变量?

示例(文件名:server.py):

import server

bar = 5

def foo():
   server.bar = 10

4 个答案:

答案 0 :(得分:5)

不要像所有其他答案中所建议的那样使用global语句,不要使用模块级变量,而是使用类作为容器,或者只使用全局变量的另一个模块:

# mg.py

bar = 5

# server.py
import mg

def foo():
    mg.bar = 10

class mg:
    bar = 5

def foo():
    mg.bar = 10

通过这种方式,您无需在任何地方添加global语句,您可以重复使用这些名称,并且明确指出您所指的bar

编辑:此外,可以在自身内部导入模块,但不能以这种方式更改主模块中的变量。所以这会奏效:

# selfimport.py
import selfimport

def foo():
    print selfimport.foo

bar = 3

if __name__ == '__main__':
    print selfimport.bar
    foo()

但这不会:

# selfimport.py
import selfimport

bar = 3

def foo():
    selfimport.bar = 5

if __name__ == '__main__':
    print selfimport.bar
    foo()
    print bar # bar is still 3!

如果您只使用全局变量作为常量,那么无论如何都不需要global语句。您还需要确保在上面的if语句中包装您只想在主模块中执行的代码,否则您将会递归。

答案 1 :(得分:1)

你无法像那样导入它,而且你不需要。只需直接使用module-global变量即可。

def foo():
    global bar
    bar = 10

您需要将其声明为全局,以便设置,而不是创建局部变量。

答案 2 :(得分:1)

为什么不:

def foo():
  global bar
  bar = 10

答案 3 :(得分:0)

不,而是使用全局声明:

def foo():
    global bar
    bar = 10