编程语言
首页 > 编程语言> > python-故意将变量放到调用者作用域内的函数

python-故意将变量放到调用者作用域内的函数

作者:互联网

我有一个函数P().调用load_variables()应该给P变量x.
load_variables应该能够接受默认值作为关键字参数.

如何才能做到这一点?

我尝试了以下方法:

import inspect
def P():
    x = 1
    load_variables(x = 2)
    return x

def load_variables(**kargs):
    stack = inspect.stack()
    try:
        locals_ = stack[1][0].f_locals
    finally:
        del stack
    for __k, __v in kargs.iteritems():
        locals_[__k] = __v

print P() # => should print 2

x = 1行实际上不应该在那儿,因为我希望load_variables()仅将x放到P的作用域中.

还有另一种也许更好的方法吗?我想要的是:

>变量具有默认值,例如在上面对load_variables()的调用中,x = 2.
>我可以在load_variables中覆盖它们,例如,load_varibales()可以访问变量字典,如果x已经存在,我们将其覆盖,并溢出该x而不是作为默认参数给出的x.

解决方法:

Python编译器和字节码解释器在可能的情况下处理将局部变量引用为已定义大小的数组中的插槽.这意味着,如果未在范围内初始化(分配给)局部变量,则该语言将不知道该变量的插槽存在于范围内,而是在封闭范围或全局范围内寻找变量.查看函数P的反汇编:

def P():
    load_variables(x=2)
    return x

dis.dis(P)
  2           0 LOAD_GLOBAL              0 (load_variables)
              3 LOAD_CONST               1 ('x')
              6 LOAD_CONST               2 (2)
              9 CALL_FUNCTION          256
             12 POP_TOP             

  3          13 LOAD_GLOBAL              1 (x)
             16 RETURN_VALUE        

您会看到,在本地范围P中未分配给x的情况下,它将在全局范围中查找它.

正确的方法是使用拆包来明确声明您希望load_variables函数返回哪些变量:

x, y, z = load_variables(...)

标签:variables,scope,metaprogramming,python
来源: https://codeday.me/bug/20191130/2077165.html