通过python中的global关键字从外部作用域访问变量

Accessing a variable from outer scope via global keyword in Python

根据这个问题的公认答案,我理解我不能创建纯粹的全局变量。好吧,酷。

然而,他接着说:

[..]all you can do is make a variable in a particular scope. (If you make a variable inside the Python interpreter, and then import other modules, your variable is in the outermost scope and thus global within your Python session.[..]

好吧,所以我们不能在最初的意义上分配全局变量,但似乎可以通过global关键字从包中访问最外部范围内的变量,对吗?

很明显,在访问通过命令行参数传递给python程序的变量的过程中,我遗漏了一些关键的东西。

我的程序有一个常见的__main__.py,它处理参数解析并执行来自python模块backend的代码。

backend具有依赖于通过命令行参数输入的代码。然而,我似乎没能把这些论点提供给backend

我的包的布局是:

1
2
3
4
5
mypackage
- __main__.py
- backend/
    -__init__.py
    -direction.py

这是__main__.py

1
2
3
4
5
6
7
8
9
10
11
12
import argparse

# Setup ArgParser
parser = argparse.ArgumentParser(description="Fancy Description of program.")
parser.add_argument('--tar', nargs=1, dest='target',
                help='Specify output folder.',
                default=['/path/to/output'])

target_dir = args.target[0]

# Import backend now that our variable is set.
from backend.direction import direction

还有我的backend/direction.py

1
2
global target_dir
print(target_dir)

运行这个程序会产生一个NameError: 'target_dir' is not defined。便便在哪里?我是在假定这里不可能,还是只是在搞砸申报单?


global只在它所使用的模块内工作。您也不使用global在全局范围(即模块范围)声明全局变量。您将在函数范围内使用global,以指示您要在全局范围内而不是在本地范围内使用变量。

在python 3中,还有一个nonlocal关键字,它允许您指示您要在非全局/模块范围的外部范围中修改一个变量。

全球的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
A = 1

def global_func():
    global A
    A = 2


def func():
    A = 3


print(A)
# 1

global_func()
print(A)
# 2

func()
print(A)
# 2

非局部的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def outside():
    a = 1

    def inside_nonlocal():
        nonlocal a
        a = 2

    def inside():
        a = 3

    print(a)
    # 1

    inside_nonlocal()
    print(a)
    # 2

    inside()
    print(a)
    # 2

我不清楚你的问题到底是什么。是否无法执行以下操作?

1
2
3
4
5
import backend

if __name__ =="__main__":
    # parse arguments
    backend.argreceive(arguments)

正如Daniel Roseman所建议的,如果有许多后端函数需要访问这些变量,那么您应该考虑使用类和类属性来存储变量。

1
2
3
class argreceive():
    def __init__(self,args):
        self.args = args