有没有办法限制函数,使其只能访问局部变量和传递的参数?
例如,考虑以下代码
a = 1
def my_fun(x):
print(x)
print(a)
my_fun(2)
通常输出将是
2
1
但是,我想将my_fun
限制在本地范围内,以便print(x)
可以工作,但在print(a)
上抛出错误。这可能吗?
我应该在前面加上:实际上不要这样做。
你(有点(可以使用函数,但你也会禁用对所有其他全局方法和变量的调用,我想你不想这样做。
您可以使用以下装饰器让函数像全局命名空间中没有变量一样工作:
import types
noglobal = lambda f: types.FunctionType(f.__code__, {})
然后调用你的函数:
a = 1
@noglobal
def my_fun(x):
print(x)
print(a)
my_fun(2)
但是,这实际上会导致与您想要的不同错误,它会导致:
名称错误: 名称"打印"未定义
不允许使用全局变量,因此也不能使用print()
。
现在,您可以将要用作参数的函数传入,这将允许您在函数中使用它们,但这不是一个好方法,最好保持全局变量干净。
a = 1
@noglobal
def my_fun(x, p):
p(x)
p(a)
my_fun(2, print)
输出:
2
NameError: name 'a' is not defined
不。 范围规则是语言基本定义的一部分。 要更改此设置,您必须更改编译器以排除上下文堆栈上较高但仍在用户空间内的项。 您显然不想限制函数上下文之外的所有符号,因为您在示例中使用了一个符号:外部函数print
。 :-)