Ipython: 无法在ipython中制作多行代码块

创建于 2018-09-27  ·  26评论  ·  资料来源: ipython/ipython

我今天在上课时刚刚做了pip install ipython ,输入了if语句,然后在第一行和执行的代码后按Enter。

这似乎是一个错误。

我做了pip install ipython==6.5.0然后在代码块中按Enter键正确显示了要输入的下一个缩进行。

我在Ubuntu 18.04上的tmux中运行ipython,尽管我怀疑tmux是这里的问题。

Hacktoberfest help wanted

最有用的评论

实际上,我的解决方案使性能下降了。 立即修复。

PR#11354现在更新。

所有26条评论

您可以使用ctrl-o强制换行。

我永远不会猜到那个。 我不确定如何更清楚地说明这一点,但是我确实认为需要澄清/掌握。 我尝试了所有我能想到的捷径,最终迫使其降级以解决我的问题。

我使用IPython可以更轻松地在REPL中键入和编辑多行块,同时向现场观众进行教学。 我怀疑其他人可能也遇到类似的问题。

可能在某处出现警告,指示Ctrl-O可用于制作多行代码块? 我不确定是否有合适的地方。

这是最近重构的错误,我只是想告诉您,如果您想使用7.x,可以同时使用Ctrl-O。

太好了! 我很高兴这只是一个错误。 谢谢@Carreau! 😄

为了给修复程序提供测试,您介意给我几个您期望的示例(有效而不是有效)吗?

我有一些,但只是收集了一些,不想影响您。

with open('hello.txt', mode='wt') as my_file:
    my_file.write('hi')
    my_file.write('hi again')

不记得第二个例子,但是有很多循环:

numbers = [2, 1, 3, 4, 7, 8, 11]

for n in numbers:
    if n > 0:
        print(n*2)
    else:
        print(n/2)

@Carreau正在解决这个问题吗? 我很乐意提供帮助

嗨,@ Deborah-Digges,我看了一眼,但到目前为止还不算太多。

我编写了这个小测试用例,以查看旧的input_splitter和新的input_transformer之间的区别:

from IPython.core import inputtransformer2 as ipt2 # new way
from IPython.core import inputsplitter #oldl way

occ =  inputsplitter.InputSplitter().check_complete
cc = ipt2.TransformerManager().check_complete

comp = lambda x : (cc(x), occ(x), x)
print(comp('if'))
print(comp('if\n\n'))
print(comp("""
def foo():
    print('Hello')"""
))
print(comp('if True:'))

导致

(('invalid', None), ('invalid', None), 'if')
(('complete', None), ('invalid', None), 'if\n\n')
(('complete', None), ('incomplete', 4), "\ndef foo():\n    print('Hello')")
(('incomplete', 4), ('incomplete', 4), 'if True:')

您会看到第三项是我们感兴趣的项。 第二个是出于好奇,因为IPython的“功能”之一是如果有两个以上的换行符,则强制执行。

相关代码的一部分位于shortcut.py:L109-L127中

我猜这在定义代码检查是否“完成”或我们应该“执行或添加新行”的角色之间存在某种混淆。

我_猜测_检查输入是否为多行以及最后一个字符是否已经为新行的启发式方法就足够了。

剩下的问题之一是在哪里放置此修复程序?

  • shortcut.py ? 如果是这样,它将只能修复终端IPython
  • 在input_transformer2中? 我认为这可能是正确的解决方案,但也可能会影响QtConsole。

让我知道这是否足以至少让您入门。

谢谢 !

@Carreau ! 非常感谢您的详细解释和测试用例。

我能够使用ipython的开发版本在本地复制它,现在将开始研究shortcut.pyinputtransformer

为了给修复程序提供测试,您介意给我几个您期望的示例(有效而不是有效)吗?

您不需要几个示例。 该错误以非常可重复的方式发生。
当行以冒号结尾时,多行

iPython的

请大写,我们不要苹果麻烦。

您不需要几个例子

好吧,不,我不需要,但我想举多个例子。 我可以重现并对如何解决它有一个想法,但是有多个案例可以帮助我确保我没有遇到任何麻烦。 对于如何使用IPython,我确实有偏见,因此其他示例很有帮助。

iPython的
请大写,我们不要苹果麻烦。

至少我发现了为什么我的名字中有上半身,谢谢和抱歉:)

道歉,这里是一个拉取请求#11354,它解决了此(主要)问题。 恕我直言,这是IPython的一个阻塞性错误,您应该考虑尽快发布(请参阅用户在github上为此发布了多少个问题)。

至少我发现了为什么我的名字中有上半身,谢谢和抱歉:)

这不是(唯一的)原因,因为IPython 0.1是在第一个iProduct之前发布的,但是通常人们会记住

道歉,这里是一个拉取请求#11354,它解决了此(主要)问题。

谢谢,如果时间允许,我来看看

您应该考虑尽快发布

是的,一旦志愿者有时间,我们就会这样做。 还有其他关键问题,例如发布jupyter_console版本,我认为这里没有人可以在$ DAYJOB上花费几个小时来这样做。 因此,它可能不得不等待本周末。

实际上,我的解决方案使性能下降了。 立即修复。

实际上,我的解决方案使性能下降了。 立即修复。

PR#11354现在更新。

感谢您的修复,知道何时发布? 我对CTRL-O使用vim键绑定对我不起作用(ESC + o可以...)

感谢您的修复,知道何时发布?

这将是该项目的志愿者之一,可以有几个免费时间来整理7.1中剩下的几个问题,然后发布。 我希望这个周末可能有几个小时,但这可能还不够。

对现有的PR /问题进行分类/审阅/标记的任何帮助都将有所帮助。

仍然可以用async with块重现,尝试了当前的master分支和来自PyPI的v7.1.1。

In [16]: async with aiofiles.open('/tmp/foobar', 'r') as f:
    ...:     content = await f.read()

In [17]: content
Out[17]: 'hello'

哼,这很可能与自动等待产生了怪异的互动。

哦,我不认为它会附属于此问题。 无论如何,它失败的原因是当我们有

async with aiohttp.ClientSession() as session:
    pass|   # < cursor is there

它在每行结束处运行check_complete ,这反过来执行compile_command ,而后者会产生SyntaxError因为'async with'在async函数之外。
在我的叉子上,我只是忽略了SyntaxError但这当然不是解决此问题的最聪明的方法,大声笑。

可能的解决方案/想法:

  • 应该检查autoawait是否打开。 如果是这样,可以忽略特定的SyntaxError情况。 我认为这不是一个好的解决方案,但也许我也使事情变得过于复杂。

  • 如果自动等待功能开启,则将compile_command()_asyncify()包装的代码一起送入。 我猜想,这样不会提高SyntaxError ,但是我不确定换行问题是否会解决,因为_asyncify()本身会增加一定程度的缩进,并且很容易变得混乱。

  • 也许_AsyncSyntaxErrorVisitor可以帮上什么忙? 但我想这是相反的

对于缺乏奉献精神,我感到抱歉,我提交了PR,但我讨厌编写测试之类的东西,也不确定是否有更好的解决方法。 但我希望它对某人仍然有用。

我们可以尝试像这样为好。

那是您的第2点,确实很丑。 换行符起作用。 最好在CPython中获得适当的支持。

这个问题还没有解决吗? 我想我可能已经抓到了这个错误...

今天这是第一次出现(在我尝试演示Python中的生成器时,在与客户进行演示期间!!!)。

我是在做错什么还是应该写多行代码块(CTRL-o解决方法除外)?

如标准Python REPL所示,预期结果:

(tsa) BillsMacBookPro:develop billtubbs$ python
Python 3.5.5 | packaged by conda-forge | (default, Jul 23 2018, 23:45:11) 
[GCC 4.2.1 Compatible Apple LLVM 6.1.0 (clang-602.0.53)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> for i in range(5):
...     x = i*2
...     print(x)
... 
0
2
4
6
8
>>> exit()

今天,当我在iPython REPL中键入相同的结果时:

(tsa) BillsMacBookPro:develop billtubbs$ ipython
Python 3.5.5 | packaged by conda-forge | (default, Jul 23 2018, 23:45:11) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.0.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: for i in range(5): 
   ...:     x = i*2                                                                   

In [2]:      

iPython REPL按预期自动缩进第二行。 但是,当我在第二行的末尾键入Enter时,它将执行这两行,而不是提供可选的第三行。

如上所述,我可以通过按CTRL-o而不是第二行上的enter来获得所需的结果:

In [2]: for i in range(5): 
   ...:     x = i*2 
   ...:     print(x)                                                                  
0
2
4
6
8

IPython 7.0.1-...

请升级您的IPython,此问题已解决,异步代码仍处于极端情况。

哦对不起。 我以为我做到了在conda update ipython我得到# All requested packages already installed.

抱歉,我有点困惑。 什么是最新版本,如何升级到该版本?

这将取决于您的安装方式,我建议尝试使用pip install看看是否可行。 但是您可能也在环境中工作。

当发生这种情况时,我会尝试主动卸载,直到无法启动IPython,然后重新安装。

此页面是否有帮助?
0 / 5 - 0 等级