2016-11-23 87 views
1

假设我已经定义了这样的函数之前如何修改函数的当地人:称其为蟒蛇

def calc(): 
    print x 

而且我想我调用前注入变种X为函数的局部用一些方法。

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

也许这是一个愚蠢的问题,但我只想知道是否有可能做到这一点?

如果我们在调用它之前无法修改它的本地人,我们可以尝试另一种方式吗?也就是说,假设我们使用的装饰或别的东西来自动修改FUNC()的定义,

def clac(x): 
    print x 

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

有人可以提供一些建议吗?

+0

可能的重复[如何在Python中使用装饰器将变量注入到作用域](http://stackoverflow.com/questions/17862185/how-to-inject-variable-into-scope-with-a-decorator-蟒蛇) –

+0

@Zero Piraeus我看到,它似乎是同一个问题,但我发现下面的答案在我的文章比你提到的更好。 – Myrfy

回答

2

这看起来像是一件非常不合常理的事情,但实际上这是可能的。对未定义名称的引用编译为全局变量引用,因此我们只需要使用不同的全局环境调用该函数。不幸的是,函数的func_globals属性是只读的,所以我们必须用函数的代码对象玩一些技巧。试试这个:

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

注意,你把字典将通过增加'__builtins__'插槽被修改 - 这使得函数访问Python的内置函数和常量。

+0

很酷。我喜欢这个答案。我会尝试另一种方法,在calc.func_code之前插入一些字节码,并用param x构建一个新函数。我认为这也会起作用。 – Myrfy