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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将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)

但是,这实际上会导致与您想要的错误不同,从而导致:

NameError:未定义名称“print”

通过不允许使用全局变量,你也不能使用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。 :-)

以上是关于将Python函数范围仅限于局部变量的主要内容,如果未能解决你的问题,请参考以下文章

变量的一些理解

Python函数:全局变量和局部变量匿名函数lambda递归函数

C语言中的局部变量和全局变量

C语言中的局部变量和全局变量

extract method

C++ static 修饰符