Ipython: ipythonで複数行のコードブロックを作成できません

作成日 2018年09月27日  ·  26コメント  ·  ソース: ipython/ipython

今日クラスを教えているときにpip install ipythonを実行し、ifステートメントを入力して、最初の行の後にEnterキーを押し、コードを実行しました。

これはバグのようです。

pip install ipython==6.5.0を実行し、コードブロックでEnterキーを押すと、入力する次のインデントされた行が正しく表示されました。

私はUbuntu18.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')

2番目の例を思い出せませんが、いくつかのループがあります。

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:')

3番目のアイテムが私たちの興味を引くものであることがわかります。 2つ目は、IPythonの「機能」の1つが、3つ以上の改行がある場合に強制実行することであるため、好奇心からでした。

関連するコードの一部はshortcut.py:L109-L127にあります。

コードのチェックが「完全」であるかどうかを定義する役割と、「実行するか、新しい行を追加する」必要があるかを定義する役割の間には、何らかの矛盾があると思います。

入力が複数行であるかどうか、最後の文字がすでに改行であるかどうかをチェックするヒューリスティックで十分であると私は_推測_しています。

残りの質問の1つは、その修正をどこに置くかです。

  • shortcut.py ? もしそうなら、それはターミナルIPythonのみを修正します
  • input_transformer2で? これは正しい解決策かもしれませんが、QtConsoleにも影響を与える可能性が高いと考えてください。

少なくとも始めるのに十分かどうか教えてください。

ありがとう!

こんにちは@Carreau ! 詳細な説明とテストケースをありがとうございました。

私はそれをipythonの開発バージョンでローカルに再現することができました。今度はshortcut.pyinputtransformerのコードを調べ始めます。

修正のテストを提供するために、期待するもののいくつかの例(機能しているものと機能していないもの)を教えていただけませんか?

いくつかの例は必要ありません。 バグは非常に再現性のある方法で発生します。
複数行は、行がコロンで終わっている場合にのみ機能します。 行末にコロンがない場合、iPythonはコードを実行します。 これは、この情報ではもう少し些細なことのように見えますが、iPythonソースコードを調べたことがないので、ここでは少し楽観的すぎるかもしれません;)

iPython

大文字でお願いします、リンゴに迷惑をかけたくないです。

いくつかの例は必要ありません

いいえ、私は_必要ありません_が、複数の例が必要です。 私はそれを再現して修正する方法を考えることができますが、複数のケースがあると、エッジケースにぶつからないようにするのに役立ちます。 私はIPythonの使用方法について偏った見方をしているので、他の例が役に立ちます。

iPython
大文字でお願いします、リンゴに迷惑をかけたくないです。

少なくとも、名前に上位のIが含まれている理由がわかりました。ありがとうございます:)

申し訳ありませんが、この(主要な)問題を修正するプルリクエスト#11354があります。 私見ですが、これはIPythonのブロッキングバグです。すぐにリリースすることを検討する必要があります(これに関してユーザーがgithubで作成する問題の数を確認してください)。

少なくとも、名前に上位のIが含まれている理由がわかりました。ありがとうございます:)

IPython 0.1は最初のiProductの前にリリースされたため、これが(唯一の)理由ではありませんが、通常、人々は覚えています

申し訳ありませんが、この(主要な)問題を修正するプルリクエスト#11354があります。

時間が許せば見てみます

すぐにリリースすることを検討する必要があります

はい、ボランティアに時間があれば、それを行います。 jupyter_consoleのリリースをリリースするなど、他にも重大な問題があります。ここにいる人は、$ DAYJOBで数時間かかるとは思いません。 そのため、今週の週末を待たなければならない場合があります。

実際、修正でリグレッションが発生しました。 今それを修正します。

実際、修正でリグレッションが発生しました。 今それを修正します。

PR#11354が更新されました。

修正してくれてありがとう、これはいつリリースされるのか? CTRL-Oにvimキーバインドを使用していますが機能しません(ESC + oは機能します...)

修正してくれてありがとう、これはいつリリースされるのか?

これは、プロジェクトのボランティアの1人であり、7.1の残りのいくつかの問題をトリアージし、リリースを行うために2、3時間の無料時間を取得します。 今週の終わりに数時間かかることを望んでいますが、それだけでは不十分かもしれません。

既存のPR /問題のトリアージ/レビュー/タグ付けに関するヘルプがあれば役立ちます。

async withブロックでも再現可能で、現在のマスターブランチと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'

うーん、それはおそらくautoawaitとの奇妙な相互作用です。

ああ、私はそれがこの問題に付随するとは思わなかった。 とにかく、それが失敗する理由は、

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

各行末でcheck_completeを実行し、次にcompile_command実行します。後者は、async関数の外部で「asyncwith」が使用されるため、 SyntaxErrorを発生させます。 。
私のフォークでSyntaxErrorミュートしましたが、それを修正する最も明るい方法ではありません、笑。

考えられる解決策/アイデア:

  • autoawaitがオンになっているかどうかを確認する必要があります。 もしそうなら、その特定のSyntaxErrorケースを無視することができます。 それは良い解決策ではないと思いますが、多分私は物事を複雑にしすぎています。

  • 自動待機がオンになっている場合は、 _asyncify()ラップされたコードをcompile_command()にフィードします。 この方法ではSyntaxErrorは発生しないと思いますが、 _asyncify()自体がある程度のインデントを追加し、簡単に乱雑になる可能性があるため、改行の問題が解決されるかどうかはわかりません。

  • 多分_AsyncSyntaxErrorVisitorは何かを助けることができますか? しかし、私はそれが逆だと思います

献身が足りなくてすみません、PRを提出しますが、テストなどを書くのは嫌いで、それを修正するためのより良い方法もわかりません。 しかし、私はそれがまだ誰かのために役立つことを願っています。

このようなことも試すことができます。

それがあなたのポイントnº2であり、それは確かに醜いです。 改行は機能します。 良いのは、CPythonで適切なサポートを受けることです。

この問題はまだ解決されていませんか? 私はこのバグを見つけたかもしれないと思います...

これは今日初めて登場します(Pythonでジェネレーターが何であるかをデモンストレーションしようとしたときにクライアントとのデモ中に!!!)。

私は何か間違ったことをしていますか、それとも複数行のコードブロックを書くために何をすべきですか(CTRL-o回避策以外)?

標準のPythonREPLで示されている期待される結果:

(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()

今日、同じものをiPythonREPLに入力したときの結果:

(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は、期待どおりに2行目を自動的にインデントします。 しかし、2行目の終わりにenterと入力すると、オプションの3行目を提供する代わりに、2行が実行されます。

上記のように、2行目でEnterキーを押す代わりにCTRL-oを押すと、目的の結果を得ることができます。

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

IPython7.0.1-..。

IPythonをアップグレードしてください。この問題は解決しました。非同期コードにはまだエッジケースがあります。

あ、ごめんなさい。 やったと思った。 後conda update ipython I GET # All requested packages already installed.

すみません、少し混乱しています。 最新バージョンとは何ですか?どのようにアップグレードしますか?

インストール方法によって異なりますが、 pip installを試して、これが機能するかどうかを確認することをお勧めします。 ただし、環境で作業している場合もあります。

そのようなことが起こったとき、私はIPythonを起動できなくなるまで積極的にアンインストールしてから、再インストールしようとします。

このページは役に立ちましたか?
0 / 5 - 0 評価