[英]Can I use IPython embed() to change the state of a function?
是否可以將 IPython 會話嵌入到函數中,以便像在全局命名空間中一樣對代碼進行更改? 如果不是,為什么? 還有其他選擇嗎?
從 IPython wiki 上關於從 Python 腳本內部嵌入 IPython 會話的條目:
請務必注意,在嵌入式 IPython shell 中運行的代碼不會更改代碼和變量的狀態,除非該 shell 包含在全局命名空間中。
這種行為的一個小例子是從 Python REPL 內部的 IPython 會話中更改變量:
>>> from IPython import embed
>>> a = 12
>>> embed()
In [1]: a = 13
In [2]: exit()
>>> a
13
但是,當嵌入到函數中時:
>>> from IPython import embed
>>> def f():
... x = 2
... embed()
... print(x)
...
>>> f()
In [1]: x = 3
In [2]:
2
雖然我不明白為什么一定要這樣(設計選擇?技術問題?)我想在全局命名空間之外用 IPython 更改我的代碼,即一個函數,應該允許行為,考慮到大多數結構良好的程序將盡可能少地保留全局命名空間(在我的情況下,我正在嘗試更改我的main()
函數)。
請不要這樣做! 這只是如何繞過此設計功能的 PoC。
您可能不會找到不涉及類似問題的解決方案。 但我將把它留在這里,這樣你就可以看到潛在的解決方法有多丑陋。
from IPython import embed
def main():
global g
g = 40
embed()
print (g)
main()
現在在 IPython repl 中,我們執行以下操作:
Python 3.9.2 (default, Feb 27 2021, 00:33:24)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.19.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: g += 2
In [2]: globals().update(dict(g=g))
In [3]:
輸出:
42
它不僅是 hacky,而且還涉及全局命名空間,根據您的說法,這是不可取的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.