如何在python中调用函数之前修改函数的本地变量

Posted

技术标签:

【中文标题】如何在python中调用函数之前修改函数的本地变量【英文标题】:How to modify function's locals before calling it in python 【发布时间】:2017-04-06 22:52:36 【问题描述】:

假设我定义了这样一个函数:

def calc():
    print x

我想在调用之前通过某种方式将 var x 注入函数的本地。

这看起来像我添加了一个关键字 x,我可以在函数 calc() 中使用 x 而无需定义它。 x 将由调用 calc() 的外部函数定义。

也许这是一个愚蠢的问题,但我只是想知道是否可以这样做?

如果我们不能在调用它之前修改它的本地,我们可以尝试另一种方式吗?那就是假设我们使用装饰器或其他东西来自动修改 func() 的定义为

def clac(x):
    print x

也许这样,我们需要玩弄函数的字节码?

谁能给点建议?

【问题讨论】:

How to inject variable into scope with a decorator in python的可能重复 @Zero Piraeus 我明白了,这似乎是同一个问题,但我发现我帖子中的答案比你提到的要好得多。 【参考方案1】:

这似乎是一件非常不正当的事情,但实际上是可能的。对未定义名称的引用编译为全局变量引用,因此我们只需要使用不同的全局环境调用函数。不幸的是,函数的func_globals属性是只读的,所以我们不得不对函数的代码对象玩一些花样。试试这个:

exec calc.func_code in 'x': 'blah'

请注意,您传递的字典将通过添​​加 '__builtins__' 插槽进行修改 - 这允许函数访问 Python 的内置函数和常量。

【讨论】:

这很酷。我喜欢这个答案。我将尝试另一种方法,在 calc.func_code 之前插入一些字节码,并使用参数 x 构建一个新函数。我认为这也行得通。

以上是关于如何在python中调用函数之前修改函数的本地变量的主要内容,如果未能解决你的问题,请参考以下文章

如何修改全局变量的值

(Python)本地化变量

python中如何对类的成员函数开启线程?

python如何引用其他模块中类的方法中的变量?

python学习7--变量的作用域

象皮筋Python 基础知识函数与函数式编程