我相信以下代碼
s = '''
...
.o.
...
'''
print(s.splitlines())
應該列印
['', '...', '.o.', '...']
確實,當 Python 正常執行時就是這種情況(在 Wandbox 上運行的示例在這里)。
但現實是無情的(像往常一樣);Google Colaboratory 列印出沒有“三點”的結果:
我還使用本地安裝的 Jupyter(Python 3.7.13、Jupyter notebook 6.4.12、IPython 7.34.0)嘗試了相同的代碼,結果與 Google Colaboratory 相同。
有誰知道是什么導致了三點的洗掉?
uj5u.com熱心網友回復:
Google 協作將解釋...為提示的一部分。您可以將提示更改為其他字串,結果將如您所料:
import sys
sys.ps2 = '<<<' # default value is ...
s = '''
...
.o.
...
'''
print(s.splitlines())
['', '...', '.o.', '...']
編輯:正如@user2357112 在評論中指出的,在他們的回答中,改變提示不會影響這一點。在這里它似乎起作用了,因為在單元格的開頭添加更多行會使 Ipython 解釋器認為它們不再是提示的一部分。您可以將字串更改'\n...\n.o.\n...'為解決方法。
uj5u.com熱心網友回復:
相信...行首表示的是互動模式下的二級提示(也就是Jupyter和Colaboratory中的模式)。你不妨試試>>>,它也是互動模式下的提示。
我認為最好改用字串'\n...\n.o.\n...'。
uj5u.com熱心網友回復:
這是一個IPython 功能。如果 IPython 認為您的輸入看起來像是從另一個互動式會話中復制粘貼的,它會在執行輸入之前洗掉它認為是互動式提示的所有內容。
這應該可以輕松地從其他互動式 Python 會話中復制和粘貼代碼,而無需手動關閉提示,但是當您的實際代碼看起來像是其中包含互動式提示時,它會導致問題。
與其他答案之一聲稱的相反,編輯sys.ps2根本不會影響這一點。提示正則運算式是硬編碼的。對于當前的 IPython,您可以在 中看到邏輯IPython.core.inputtransformer2.PromptStripper,但 Google Colab 目前使用的是舊的 IPython 版本 5.5.0,您應該在其中查看IPython.core.inputtransformer.classic_prompt:
@CoroutineInputTransformer.wrap
def classic_prompt():
"""Strip the >>>/... prompts of the Python interactive shell."""
# FIXME: non-capturing version (?:...) usable?
prompt_re = re.compile(r'^(>>>|\.\.\.)( |$)')
initial_re = re.compile(r'^>>>( |$)')
# Any %magic/!system is IPython syntax, so we needn't look for >>> prompts
turnoff_re = re.compile(r'^[%!]')
return _strip_prompts(prompt_re, initial_re, turnoff_re)
編輯sys.ps2看起來只是有幫助,因為_strip_prompts如果在前兩行中沒有找到任何提示,則停止尋找提示,并且要編輯的額外代碼sys.ps2意味著_strip_prompts在這些行中沒有找到任何提示。
不幸的是,如果你想禁用它,它會比編輯更尷尬sys.ps2。我認為沒有方便的配置選項。我認為您必須檢索輸入清理轉換器串列并手動洗掉提示剝離器。在 Google Colab 當前使用的 IPython 版本上,如下所示:
physical_line_transforms = get_ipython().input_transformer_manager.physical_line_transforms
physical_line_transforms[:] = [transformer for transformer in physical_line_transforms
if transformer.coro.__name__ != '_strip_prompts']
coro并且_strip_prompts是未記錄的實作細節,但我認為沒有更好的方法。
在更現代的 IPython 上,代碼如下所示:
from IPython.core.inputtransformer2 import PromptStripper
cleanup_transformers = get_ipython().input_transformers_cleanup
cleanup_transformers[:] = [transformer for transformer in cleanup_transformers
if not isinstance(transformer, PromptStripper)]
與其他片段不同,我認為這里的所有內容都是記錄在案的 IPython API 的一部分。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/492568.html
標籤:Python 细绳 jupyter-笔记本
上一篇:從C 中的字串中洗掉多余的空格
下一篇:簡單的DNA模式匹配
