2016-11-23 98 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