簡體   English   中英

我可以使用 IPython embed() 來更改函數的狀態嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM