[英]does python 2.5 have an equivalent to Tcl's uplevel command?
python是否等效於Tcl的上層命令? 對於那些不知道的人,“ uplevel”命令使您可以在調用者的上下文中運行代碼。 這是它在python中的外觀:
def foo():
answer = 0
print "answer is", answer # should print 0
bar()
print "answer is", answer # should print 42
def bar():
uplevel("answer = 42")
但是,這不僅僅是設置變量,所以我不是在尋找僅更改字典的解決方案。 我希望能夠執行任何代碼。
通常,您要求的是不可能的(毫無疑問,您期望得到的結果)。 例如,假設“任何代碼”是x = 23
。 假設您確實發現“在調用方中”執行此代碼的黑魔法方法,這是否會在調用方的局部變量集中添加新變量x
? 不,它不會-Python編譯器執行的關鍵優化是一勞永逸地定義,當def
執行時,精確定義一組局部變量(在函數體內分配或綁定的所有裸名) ,然后將對這些裸名的所有訪問和設置轉換為非常快速的索引到堆棧框架中。 (您可以系統地挫敗該關鍵的優化,例如,在每個可能的調用者開始時都使用exec ''
-從而導致系統性能徹底崩潰)。
除了分配給呼叫者的本地裸名, exec thecode in thelocals, theglobals
本地exec thecode in thelocals, theglobals
,全局變量可能會大致執行您想要的操作,而inspect
模塊可讓您以一種半合理的方式獲取呼叫者的本地變量和全局變量(就深黑色魔術而言) -會讓我發郵件通知任何建議其在生產代碼中使用的同事-可以用稱其為“半合理”的方式得到應有的稱贊,即;-)。
但是您確實指定了“我希望能夠執行任何代碼”。 並於明確規范的唯一解決方案(!同時感謝您如此精確,因為它使回答更簡單)是:然后,使用不同的編程語言。
第三方庫是用Python編寫的嗎? 如果是,則可以在運行時使用您自己的實現重寫並重新綁定函數“ foo”。 像這樣:
import third_party
original_foo = third_party.foo
def my_foo(*args, **kwds):
# do your magic...
original_foo(*args, **kwds)
third_party.foo = my_foo
我猜猴子修補比重寫框架本地修補要好得多。 ;)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.