当前位置: 首页 > 知识库问答 >
问题:

为什么拆分线()没有给出木星中三个点的预期结果?

商佑运
2023-03-14

我相信下面的代码

s = '''
...
.o.
...
'''
print(s.splitlines())

应打印

['', '...', '.o.', '...']

事实上,当Python正常执行时就是这种情况(这里是在Wandbox上运行的示例)。

但现实是无情的(像往常一样);Google Colborator打印一个没有“三个点”的结果:

我还用本地安装的Jupyter(Python 3.7.13、Jupyter notebook 6.4.12、IPython 7.34.0)尝试了相同的代码,结果与Google Colaboratory相同。

有人知道是什么导致了三个点的删除吗?

共有3个答案

宰父夕
2023-03-14
匿名用户

这是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)

编辑系统。ps2看起来很有用,因为\u strip_prompts在前两行中没有找到任何提示时会停止寻找提示,并且需要编辑的额外代码sys。ps2表示在这些行中未找到任何提示。

不幸的是,如果您想禁用此功能,它将比编辑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\u提示是未记录的实现细节,但我认为没有更好的方法。

在更现代的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)]

与其他代码片段不同,我认为这里的所有内容都是有文档记录的iPythonAPI的一部分。

凌成天
2023-03-14

我相信 表示交互模式下的辅助提示(即Jupyter和Colaboratory中的模式)。您可能想试试

我认为最好使用字符串“\n。。。\n、 o.\n.' ”。

曾枫
2023-03-14

Google collab解释<代码> 作为提示的一部分 您可以将提示更改为其他字符串,结果将如您所料:

 
  import sys
sys.ps2 = '<<<' # default value is ...

s = '''
...
.o.
...
'''
print(s.splitlines())
['', '...', '.o.', '...']

 

编辑:正如@user2357112在评论和他们的回答中指出的那样,更改提示不会影响这一点。在这里,它似乎有效,因为在单元格的开头添加更多行会使Ipython解释器认为它们不再是提示的一部分。您可以将字符串更改为 '\n...\n. o.\n...'作为解决方法。

 类似资料:
  • 这是我索引中的文档(也可以有几个): 从逻辑上讲,我试图建立这个条件: 我的问题(来自kibana): 我正在与上述范围内的字段的范围查询与上面的其他字段进行比较。但没有得到任何命中!我想检索具有在给定和日期。 在这个领域很缺乏经验,不知道为什么不起作用!请帮助如何修复此查询以做到这一点?

  • 我正在使用Standard ardAnalyser索引10个文本文档。 上面是用来索引文档的代码片段。出于测试目的,我正在搜索一个名为“灰烬”的字段。 当我使用QueryParser时,Lucene给出了预期的搜索结果。 但是,当我使用TermQuery API时,我没有得到所需的结果。我正在展示我为TermQuery所做的代码更改。 对stackoverflow本身做了一些研究,例如Lucene

  • 我有一个索引,其中我的每个对象都有状态字段,该字段可以有一些预定义的值。我想获取所有状态为“已启动”、“已更新”、“已删除”的查询,任何与这些匹配的,因此我使用Querybuilder和nativeSearchQuery,通过ElasticsearchOperations在控制台上打印的java创建了这个查询: 我的索引中有“INITIATED”状态的数据,但没有得到查询中提到的任何状态的人。请如

  • 我想根据X列重新划分spark dataframe。假设X列有3个不同的值(X1,X2,X3)。不同值的数量可能会变化。 我希望一个分区包含只有1个X值的记录。也就是说,我想要3个分区,其中1有x=x1的记录,其他的有x=x2,最后一个有x=x3的记录。 我正在做的重新划分 但是,我在DF中的分区并没有像预期的那样出现。由于一个分区为空,第二个分区包含X1的记录,第三个分区同时包含X2和X3的记录

  • 当我在本文中使用<code>dplyr::case_when<code>而不是<code>if<code>时,我注意到了下面的这种行为。如果第二个分支的输出是一个显式字符串,它将按预期工作,但如果指定了<code>x</code>本身,结果将发生变化。 为什么只有< code>case_when给出不同的结果? 由reprex软件包(v2.0.1)于2022年8月16日创建