如何在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中调用函数之前修改函数的本地变量的主要内容,如果未能解决你的问题,请参考以下文章