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

时间:2018-03-01 17:01:40

标签: python function scope global-variables

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

例如,请考虑此代码

a = 1
def my_fun(x):
    print(x)
    print(a)
my_fun(2)

通常输出为

2
1

但是,我想将my_fun限制为本地范围,以便print(x)可以正常工作,但会在print(a)上抛出错误。这可能吗?

2 个答案:

答案 0 :(得分:3)

不。范围规则是语言基本定义的一部分。要更改此设置,您必须更改编译器以排除上下文堆栈中较高的项目,但仍在用户空间内。您显然不希望将所有符号限制在函数的上下文之外,因为您在示例中使用了一个外部函数print。 : - )

答案 1 :(得分:1)

我觉得我应该这样做:实际上不要这样做。

你(有点)可以使用函数,但是你也将禁用对所有其他全局方法和变量的调用,我不认为你想这样做。

您可以使用以下装饰器使该功能像全局命名空间中没有变量一样:

    preferences = getSharedPreferences("userData", MODE_PRIVATE);

    goalSave = preferences.getString("goals", goalSave);
    if (goalSave != null) {
        showGoalTextView.setText(goalSave);
        hideAll();
    } else {
        resetAll();
    }

    beamsSave = preferences.getString("beam", beamsSave);
    if (beamsSave != "0") {
        showBeamsTextView.setText(beamsSave);
        hideAll();
    } else {
        resetAll();
    }

然后调用你的函数:

import types
noglobal = lambda f: types.FunctionType(f.__code__, {})

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

  

NameError:name' print'未定义

不允许使用全局变量,也不能使用a = 1 @noglobal def my_fun(x): print(x) print(a) my_fun(2)

现在,你可以传入你想要用作参数的函数,这样你就可以在函数中使用它们,但这不是一个好方法,而且保持你的全局变量更好。< / p>

print()

输出:

a = 1
@noglobal
def my_fun(x, p):
    p(x)
    p(a)
my_fun(2, print)