我懷疑是我想做的事情在Python中很乾淨。這裏有幾個互相調用的嵌套函數。 (一般情況下,他們沒有被詞法範圍,但需要動態地稱呼對方。)在Python中調用函數的訪問變量
def outer() :
s_outer = "outer\n"
def inner() :
s_inner = "inner\n"
do_something()
inner()
現在,當我打電話do_something()
話,我想進一步上漲訪問調用函數中的變量callstack,在這種情況下爲s_outer
和s_inner
。
不幸的是,這裏的nonlocal
關鍵字只有在我定義了inner()
函數中的do_something()
時纔對我有所幫助。但是,如果我將其定義在與outer()
相同的級別,那麼nonlocal
關鍵字將不起作用。
但是,我想從各種其他函數調用do_something()
,但始終在其各自的上下文中執行它並訪問它們各自的作用域。
感覺調皮然後我寫了一個小訪問,我可以從do_something()
這樣的內撥打:
def reach(name) :
for f in inspect.stack() :
if name in f[0].f_locals : return f[0].f_locals[name]
return None
然後
def do_something() :
print(reach("s_outer"), reach("s_inner"))
的作品就好了。
我的兩個問題是這些
有沒有更好的辦法來解決這個問題呢? (除包裝各自的數據爲類型的字典,並明確地傳遞這些類型的字典來
do_something()
)是否有實現
reach()
功能更優雅/縮短呢?
乾杯!
我擔心這就是答案。呃,好吧。與reach()函數的作用無關,是否有一種更緊湊的方式來實現嵌套/如果? – Jens 2013-03-25 12:52:11
@Jens不能拿出任何可讀性更強的東西。你可以檢查從'inspect.currentframe()'遍歷'f_back'是否看起來更好。 – bereal 2013-03-25 13:02:23