假设我已经定义了这样的函数:
def calc():
print x
我想在调用之前通过某种方式将var x注入函数的本地。
这看起来像我添加了一个关键字x,我可以在函数calc()中使用x而不定义它。 x将由调用calc()的外部函数定义。
也许这是一个愚蠢的问题,但我只想知道是否可以这样做?
如果我们在调用它之前无法修改它的本地人,我们可以尝试另一种方式吗?假设我们使用装饰器或其他东西将func()的定义自动修改为
def clac(x):
print x
也许这样,我们需要使用函数的字节码?
有人可以提供一些建议吗?
答案 0 :(得分:2)
这似乎是一件非常有悖常理的事情,但它实际上是可能的。对未定义名称的引用编译为全局变量引用,因此我们只需要使用不同的全局环境调用该函数。不幸的是,函数的func_globals
属性是只读的,所以我们必须使用函数的代码对象来玩一些技巧。试试这个:
exec calc.func_code in {'x': 'blah'}
请注意,您传递的字典将通过添加'__builtins__'
插槽进行修改 - 这允许该函数访问Python的内置函数和常量。