Ipython: 7.2.0で再び壊れたパスのタブ補完

作成日 2018年12月14日  ·  32コメント  ·  ソース: ipython/ipython

文字列内のパスのタブ補完が再び壊れているようです(以前は、#10961、#10996、ノートブックの問題#3333などの多くの場所で指摘されていました)。 これが私がv7.2.0得るものです:

screen shot 2018-12-14 at 12 39 17 pm

v7.1.1の動作と比較して:

screen shot 2018-12-14 at 12 38 20 pm

Jediを無効にする( ipython_config.py c.IPCompleter.use_jedi = Falseを設定する)と正しい動作が得られるため、おそらく#11503に関連しています。

システム情報

{'commit_hash': '523ed2fe5',
 'commit_source': 'installation',
 'default_encoding': 'UTF-8',
 'ipython_path': '/usr/local/lib/python3.6/site-packages/IPython',
 'ipython_version': '7.2.0',
 'os_name': 'posix',
 'platform': 'Darwin-17.7.0-x86_64-i386-64bit',
 'sys_executable': '/usr/local/opt/python/bin/python3.6',
 'sys_platform': 'darwin',
 'sys_version': '3.6.5 (default, Jun 17 2018, 12:13:06) \n'
                '[GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.2)]'}

help wanted tab-completion

最も参考になるコメント

ipython == 7.1.1へのダウングレードは、私にとっては修正として機能しているように見えました。

全てのコメント32件

同じ問題、ipython7.2.0があります。

ipython == 7.1.1へのダウングレードは、私にとっては修正として機能しているように見えました。

jediを有効にすることがワークフローに役立つかどうか誰かが共有できますか?もしそうなら、私はその方法を知りたいですか?

それは確かに私の人生をはるかに難しくしました:マルチレベルの完了、フォルダーの完了、またはセルを実行する前にオートコンプリートを使用することはできません( df = pd.DataFrame(); df.val<TAB>失敗します)

バグは確かに私の人生もはるかに困難にしました。

オートコンプリートは、おそらくインタラクティブシェルの最も重要な機能の1つです。 ジェダイとパスのオートコンプリートを共存させる方法はありますか?
ジェダイまたはレガシー補完を使用することを決定する際のいくつかの非常に単純なヒューリスティックは、大いに役立ちます。文字列内にある場合、現在の名前空間からの名前が必要になる可能性はほとんどありません。

ダウングレードで問題が発生した場合は、 @ ivirshupのコメントが最も役立つことがわかりましたjediオートコンプリートを無効にします。 まだ行っていない場合は、次の方法でipython_config.pyを生成できます。

# Generate config
ipython profile create
# Edit config file in vim
vim .ipython/profile_default/ipython_kernel_config.py 

そして、 ipython_config.py c.IPCompleter.use_jedi = Falseを変更します

[ジェダイコンプリーター]は確かに私の人生をはるかに困難にしました:マルチレベルの完了、フォルダーの完了、[…]

ダメダメダメ。 それを行うのはジェダイコンプリーターではありません。 複数のコンプリーターがあり、コンプリーター選択コードが壊れているために間違ったコンプリーターが選択されていると説明しています。 そして、jediを有効にしてコンプリーターのリストに触れると、そのバグが明らかになりました。 @takluyverは、 https: //github.com/ipython/ipython/pull/10996#issuecomment-378288569で問題について説明してい

ジェダイを再度無効にすることは一時的な回避策ですが、実際には完全な選択コード(#11064だと思います)を修正する方がはるかに優れた解決策になるでしょう。

私の理解では、すべてのコンプリーターが同時に作業しています。 コンプリーターはここで定義さ同時に使用さmatchesリスト(オートコンプリートの結果)には、すべてのコンプリーターの結果の連結が含まれ、 file_matchesコンプリーターは引き続きその一部です。

したがって、jediが有効になっている場合、パス/ファイル名の補完は「壊れた」わけではありません。(jediからの)結果が多すぎて、ファイルパスが一致しなくなったことがわかりません。

修正の最初のアイデアは、文字列を入力するときにjediのオートコンプリートを無効にすることです。 それはうまくいくでしょうか?
evalまたはexec使用してコードを実行する場合、機能しないのはオートコンプリートだけですが、すべてのユースケースを修正できるわけではないと思います。 また、ファイルパスのオートコンプリートが好きな人もいるようです。

編集: @ flying-sheep#11064にリンクした他の問題を読んで、文字列を入力するときにjediを使用しないロジックがすでにあることを理解していますが、壊れていますか?

私が言っていることを説明するためだけに。 両方のスクリーンショットはjediを使用して撮影されました。パスのオートコンプリートが引き続き機能することがわかります。一致するものが多いため、もう少し入力する必要があります。
test1
test2

これは一般的に私の問題です。少し入力すると便利ですが、ファイルの最初の文字がわからない場合は、常にオプションであるとは限りません。 パスの入力を明確に開始した場合でも、各「/」の後に、コンプリーターはabs()、all()、およびその他の組み込みを表示するデフォルトモードに「リセット」します。
image

ネストされたフォルダがいくつかある長いパスがある場合、これは大きな問題です。 Bashのオートコンプリートは、「タブ」に何かを追加するだけです。 現在のipythonオートコンプリートでは、各フォルダー/ファイルの最初の文字またはいくつかを覚えて入力し、ファイル/フォルダーを見つける前にいくつかのビルトインを確認する必要があります。

オートコンプリートからすべてのビルトインとすべてのipythonマジックを削除する方法があれば、それはすでにはるかに優れているでしょう!

'abs'と入力する方法を知っています。ほとんどの場合、オートコンプリートリストから選択するよりも数倍速く入力できます。 そもそもそこにあるのには、それと他の3〜4文字の長さのビルトインの正当な理由があるかどうかはわかりません! 理想的には、ビルトインのリストを編集する方法があれば、DepercationWarningのように、使用する長い名前をいくつか残して、他のすべてを削除します。

画像のユースケースを見てください。文字列リテラル内にPythonオブジェクト名を入力するのはなぜですか?

私は簡単なユースケースを見つけることができます:

exec("print(abs(-3))", [globals()])

あまり一般的ではないユースケースかもしれませんが、発生する可能性があります。 ほとんどのユーザーにとって、パスの完了がこのユースケースよりも重要であることに同意します。

ええ、それは可能性であり、一部の人々は幹部に大きく依存しています。

理想的には、オートコンプリートはファイル名モードであることを検出し、そこから通常のbashタブ補完のように機能する必要があります。 優れたプロキシは、「/」、「./」、「C:」、「D:」などで始まります。

これらの変数で始まる文字列に有効なPython式が含まれる可能性はさらに低くなります。

a = "C:print(abs(-3))"; exec(a[2:])例を作ることができると確信していますが、それはほとんどありません。

ええ、実際には、文字列を入力しているときに、コードはジェダイの補完をスキップすることになっています。 次の行を参照してください: https
また、文字列内にあるかどうかを判断するために、jediの内部解析ロジックに依存しています。
このコードを少しテストしたところ、少し壊れていることがわかりました。たとえば、 path = "と入力すると、文字列内にあることがわかりますが、 path = "./は表示されません。 tokenizeを使用してより良い解決策を考え出すことができると思います。

ジェダイがErrorLeafだと思っていないからなのか、それとも2ノード戻るだけでは不十分だからなのか。

よくわかりませんが、内部のjediのもの(プライベートAPI)に依存しているという事実が気に入らなかったため、すぐにtokenizeに切り替えました。

tokenizeにも問題があります。 文字列が開く前にセルがIndentationErrorまたはSyntaxErrorを発生させた場合はどうなりますか?

行を徐々にバックトラックする必要があるかもしれませんが、文字列宣言が不完全なため、カーソルの近くで常にエラーが発生することが予想されますか?

tokenizeを使用すると、 inputtransformer2.py実行されるような単純なロジックを考えています。 ユーザーが端末にリストまたは辞書を入力しているかどうかを知るためのロジックがいくつかあるため、 enterを押したときにコードを実行せずに、新しい行を挿入します。
test1
test2
たぶん、 "'文字と同等のものを試すことができます(私はPRを考え出すことができます)。

また、別のアイデアは正規表現を使用することかもしれませんが、この場合は役に立たないでしょう:P

tokenizeにも問題があります。 文字列を開く前にセルでIndentationErrorまたはSyntaxErrorが発生した場合はどうなりますか

私はそれが完全ではないと思います...現在の動作は何ですか? コードにSyntaxErrorがある場合でも、オートコンプリートは機能しますか? 確認する必要があります

7.3.0にアップデートした後も同じ問題。

はい、SyntaxErrorがある場合は機能します。

Screenshot from 2019-03-28 10-48-20

IIRC tokenizeは、構文エラーに対してかなり堅牢です。表示する種類のスニペットは、引き続き正常にトークン化できます。エラーは、トークンを理解しようとした場合にのみ発生します。

前の行の終了していない文字列のようなものでどうなるかわかりません。これは、トークン化レベルでの構文エラーである可能性があります。

最新のcondaインストールに関する同様の問題:

python                    3.7.3
ipykernel                 5.1.0              
ipython                   7.4.0           

実際タブ補完はまったくあり

condaを介してインストールされたIPython7.7.0に問題が残っています。

ipython                   7.7.0            py37h5ca1d4c_0    conda-forge
ipython_genutils          0.2.0                      py_1    conda-forge
jedi                      0.14.1                   py37_0    conda-forge
python                    3.7.3                h33d41f4_1    conda-forge

そして、それはこの問題と#10926が閉じられるまで続きます。 @ JeremySikes73と私はそこで何が問題なのかを説明しましたが、問題は同じだと確信しています。IPythonのマッチャーはすべて結果を返しますが、a)関連するものだけを実行するか、b)マッチャーにコードを追加して結果が無関係である場合、それらは何も返しません。

助けてくれてありがとう。でも、「まだ問題だ」と言うよりも、#10926を読んでコードを調べ、状況を改善する方法を見つける方が生産的だと思います。

@meeseeksdevタグヘルプ募集

@meeseeksdevタグタブ-完了

ダウングレードで問題が発生した場合は、 @ ivirshupのコメントが最も役立つことがわかりましたjediオートコンプリートを無効にします。 まだ行っていない場合は、次の方法でipython_config.pyを生成できます。

# Generate config
ipython profile create
# Edit config file in vim
vim .ipython/profile_default/ipython_kernel_config.py 

そして、 ipython_config.py c.IPCompleter.use_jedi = Falseを変更します

どのファイルを編集しますか? ipython_kernel_config.pyまたはipython_config.py

この問題の一時的な回避策は、Tabキーを押した後に2番目のスラッシュを追加することです。

'/<TAB>入力した後
image

/入力した後
image

アイテムを選択すると、区切り文字としてスラッシュが1つだけ表示されます。

リターンを押した後
image

タブを押す前に2番目のスラッシュを追加しても、ポップアップメニューは変更されないことに注意してください。

今日(7.11.0)の時点で最新バージョンのipythonにアップグレードしましたが、問題は解決しません。

@ flying-sheep @augustogoulartこれについてリクエストをプルすることはできますか? (つまり、「helpwanted」タグはそう示唆していますが、私は既存の寄稿者ではないので、ここでの開発者の基準がわかりません。)文字列内にあるかどうかの検出のロジックにいくつかの小さな変更があります。 、これは完全な修正ではありませんが、少なくともジェダイをオフにするより良い仕事をします。

(私の意見では)オフにするといいので、これは#10926またはこれを完全に修正するわけではありません:

  • 辞書のキー文字列にある場合、ファイルの補完が一致します
  • 魔法の補完は、どの文字列でも一致します

しかし、文字列内では少なくともジェダイをオフにします。これは、私自身の使用パターンを実行可能にするのに大いに役立ちます。

私自身はほんの少しの貢献者ですが、彼らはこれを修正するための助けを求めているに違いありません!

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