将Python函数范围仅限于局部变量

Tau*_*das 5 python scope function global-variables

有没有办法限制函数,以便它只能访问局部变量和传递参数?

例如,请考虑此代码

a = 1
def my_fun(x):
    print(x)
    print(a)
my_fun(2)
Run Code Online (Sandbox Code Playgroud)

通常输出将是

2
1
Run Code Online (Sandbox Code Playgroud)

但是,我想限制my_fun为本地范围,以便print(x)可以工作,但抛出错误print(a).那可能吗?

use*_*203 4

我觉得我应该以此作为序言:实际上不要这样做。

您(在某种程度上)可以使用函数,但您还将禁用对所有其他全局方法和变量的调用,我不认为您愿意这样做。

您可以使用以下装饰器让函数表现得就像全局命名空间中没有变量一样:

import types
noglobal = lambda f: types.FunctionType(f.__code__, {})
Run Code Online (Sandbox Code Playgroud)

然后调用你的函数:

a = 1
@noglobal
def my_fun(x):
    print(x)
    print(a)
my_fun(2)
Run Code Online (Sandbox Code Playgroud)

然而,这实际上会导致与您想要的不同的错误,它会导致:

NameError:名称“print”未定义

如果不允许使用全局变量,那么您就不能使用print()其中任何一个。

现在,您可以传入要用作参数的函数,这将允许您在函数内部使用它们,但这不是一个好方法,最好保持全局变量干净。

a = 1
@noglobal
def my_fun(x, p):
    p(x)
    p(a)
my_fun(2, print)
Run Code Online (Sandbox Code Playgroud)

输出:

2
NameError: name 'a' is not defined
Run Code Online (Sandbox Code Playgroud)