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

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

def calc():
    print x

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

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

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

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

def clac(x):
    print x

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

谁能给点建议?

【问题讨论】:

标签: python-2.7


【解决方案1】:

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

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

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

【讨论】:

  • 这很酷。我喜欢这个答案。我将尝试另一种方法,在 calc.func_code 之前插入一些字节码,并使用参数 x 构建一个新函数。我认为这也行得通。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-04
  • 2020-01-22
  • 2022-08-21
  • 2017-04-23
  • 2012-02-06
  • 2017-03-06
  • 1970-01-01
相关资源
最近更新 更多