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



有没有办法限制函数,使其只能访问局部变量和传递的参数?

例如,考虑以下代码

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 。 :-)

相关内容

  • 没有找到相关文章

最新更新