Ipython: Tab-Vervollständigungen für Pfade, die in 7.2.0 erneut unterbrochen wurden

Erstellt am 14. Dez. 2018  ·  32Kommentare  ·  Quelle: ipython/ipython

Die Tab-Vervollständigung für Pfade innerhalb von Zeichenfolgen scheint erneut unterbrochen zu sein (bereits an vielen Stellen erwähnt, z. B. # 10961, # 10996, Notebook-Problem # 3333 ). Folgendes bekomme ich in v7.2.0 :

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

Im Vergleich zum Verhalten in v7.1.1 :

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

Wahrscheinlich im Zusammenhang mit # 11503, da das Deaktivieren von Jedi (Setzen von c.IPCompleter.use_jedi = False in ipython_config.py ) das richtige Verhalten ergibt.

Systeminformationen

{'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

Hilfreichster Kommentar

Ein Downgrade auf ipython == 7.1.1 schien für mich eine Lösung zu sein.

Alle 32 Kommentare

Ich habe das gleiche Problem, Ipython 7.2.0.

Ein Downgrade auf ipython == 7.1.1 schien für mich eine Lösung zu sein.

Könnte jemand teilen, wenn das Aktivieren von jedi seinem Workflow geholfen hat, und wenn ja, würde ich gerne wissen, wie?

Es hat mir das Leben sicherlich viel schwerer gemacht: Keine mehrstufige Fertigstellung, keine Ordnervervollständigung, noch kann ich die automatische Vervollständigung verwenden, bevor die Zelle ausgeführt wird ( df = pd.DataFrame(); df.val<TAB> schlägt fehl)

Der Fehler hat sicherlich auch mein Leben viel schwieriger gemacht.

Die automatische Vervollständigung ist wahrscheinlich eines der wichtigsten Merkmale einer interaktiven Shell. Gibt es eine Möglichkeit, wie jedi und die automatische Vervollständigung von Pfaden koexistieren können?
Einige sehr einfache Heuristiken bei der Entscheidung, Jedi zu verwenden, oder die Vervollständigung des Legacy helfen auf lange Sicht: Wenn man sich in einer Zeichenfolge befindet, ist es unwahrscheinlich, dass man Namen aus dem aktuellen Namespace möchte.

Für diejenigen, die auf Probleme mit dem Downgrade gestoßen sind , fand @ivirshup am hilfreichsten - um die automatische Vervollständigung von jedi in der ipython-Konfiguration zu deaktivieren. Wenn Sie es noch nicht getan haben, können Sie ein ipython_config.py generieren mit:

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

Und ändern Sie c.IPCompleter.use_jedi = False in ipython_config.py

[Der Jedi-Vervollständiger] hat mir das Leben sicherlich viel schwerer gemacht: keine mehrstufige Fertigstellung, keine Ordnervervollständigung, […]

Nein nein Nein. Es ist nicht der Jedi-Vervollständiger, der das tut. Es gibt mehrere Vervollständiger, und Sie beschreiben, dass der falsche Vervollständiger ausgewählt wurde, weil der Vervollständigerauswahlcode fehlerhaft ist. Und das Berühren der Liste der Vervollständiger durch Aktivieren von jedi deckte diesen Fehler auf. @takluyver beschreibt das Problem unter https://github.com/ipython/ipython/pull/10996#issuecomment -378288569.

Das erneute Deaktivieren von jedi ist eine vorübergehende Problemumgehung, aber das Korrigieren des vollständigen Auswahlcodes (# 11064, glaube ich) wäre natürlich eine viel bessere Lösung.

Mein Verständnis ist, dass alle Vervollständiger gleichzeitig arbeiten. Completers definiert sind hier , und sie sind alle verwendeten zugleich . Die Liste matches (das Ergebnis der automatischen Vervollständigung) enthält die Verkettung aller Vervollständigerergebnisse, und der Vervollständiger file_matches ist immer noch Teil davon.

Die Vervollständigung des Pfads / Dateinamens ist also nicht "unterbrochen", wenn jedi aktiviert ist. Es gibt nur so viele Ergebnisse (von jedi), dass Sie nicht mehr sehen können, dass Ihr Dateipfad übereinstimmt.

Meine erste Idee für ein Update wäre, die automatische Vervollständigung von Jedi zu deaktivieren, wenn Sie eine Zeichenfolge eingeben. Funktioniert das?
Das einzige, was nicht funktionieren würde, ist die automatische Vervollständigung, wenn Code mit eval oder exec , aber ich denke, wir können nicht jeden einzelnen Anwendungsfall beheben. Und es sieht so aus, als würden einige Leute den Dateipfad automatisch vervollständigen.

BEARBEITEN: Wenn ich das andere Problem lese, das Sie mit @ fliegenden Schafen # 11064 verlinkt haben, verstehe ich, dass es bereits eine Logik gibt, Jedi beim Eingeben eines Strings nicht zu verwenden, aber es ist kaputt?

Nur um zu veranschaulichen, was ich sage. Beide Screenshots wurden mit jedi aufgenommen. Sie sehen, dass die automatische Vervollständigung des Pfads immer noch funktioniert. Sie müssen nur etwas mehr eingeben, da es mehr Übereinstimmungen gibt.
test1
test2

Das ist im Allgemeinen mein Problem: Ein bisschen tippen hilft, aber es ist nicht immer eine Option, wenn Sie den ersten Buchstaben der Datei nicht kennen. Selbst wenn Sie eindeutig mit der Eingabe eines Pfads begonnen haben, wird der Vervollständiger nach jedem "/" auf den Standardmodus zurückgesetzt, in dem mir abs (), all () und andere integrierte Funktionen angezeigt werden.
image

Es ist ein großes Problem, wenn Sie lange Pfade mit einigen verschachtelten Ordnern haben. Bash Autocompletion würde nur Dinge auf "Tab" hinzufügen. Bei der aktuellen automatischen Vervollständigung von ipython müssen Sie sich den ersten Buchstaben oder einige von jedem Ordner / jeder Datei merken, ihn eingeben und dann noch einige integrierte Funktionen umgehen, bevor Sie Ihre Datei / Ihren Ordner finden.

Wenn es eine Möglichkeit gäbe, alle eingebauten Elemente aus der automatischen Vervollständigung und alle Ipython-Magie zu entfernen, wäre dies bereits viel besser!

Ich weiß, wie man 'abs' eingibt, und die meisten von uns können es mehrmals schneller eingeben, als es aus der Autovervollständigungsliste auszuwählen. Ich bin mir nicht sicher, ob es einen guten Grund dafür und andere 3-4 Buchstaben lange Buildins gibt, überhaupt dort zu sein! Wenn es eine Möglichkeit gäbe, die Liste der eingebauten Elemente zu bearbeiten, würde ich im Idealfall nur ein paar lange Namen hinterlassen, die ich verwende, wie z. B. DepercationWarning, und alles andere loswerden.

Schauen Sie sich einfach den Anwendungsfall im Bild an: Warum sollte ich einen Python-Objektnamen in ein Zeichenfolgenliteral eingeben?

Ich kann einen einfachen Anwendungsfall finden:

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

Vielleicht ist es ein weniger verbreiteter Anwendungsfall, aber es kann passieren. Ich würde zustimmen, dass die Pfadvervollständigung für die meisten Benutzer wichtiger ist als dieser Anwendungsfall.

Ja, es ist eine Möglichkeit, und einige Leute verlassen sich sehr auf Exec.

Im Idealfall sollte die automatische Vervollständigung erkennen, dass sie sich in einem Dateinamenmodus befindet, und von da an wie eine normale Vervollständigung der Bash-Registerkarte funktionieren. Ein guter Proxy beginnt mit "/", "./" oder "C:" "D:" usw.

Es ist noch weniger wahrscheinlich, dass Zeichenfolgen, die mit diesen Variablen beginnen, gültige Python-Ausdrücke enthalten.

Ich bin sicher, man kann ein Beispiel für a = "C:print(abs(-3))"; exec(a[2:]) aber das ist sehr unwahrscheinlich.

Ja, eigentlich soll der Code die Jedi-Vervollständigung überspringen, wenn Sie eine Zeichenfolge eingeben. Siehe diese Zeile: https://github.com/ipython/ipython/blob/65778adec13a65f82c5d2bab123e7a63516702c8/IPython/core/completer.py#L1375
Und es basiert auf der internen Parsing-Logik von jedi, um herauszufinden, ob wir uns in einer Zeichenfolge befinden oder nicht.
Ich habe diesen Code ein wenig getestet und es stellt sich heraus, dass er etwas kaputt ist. Wenn Sie beispielsweise path = " eingeben, wird angezeigt, dass Sie sich in einer Zeichenfolge befinden, jedoch nicht mit path = "./ . Ich denke, wir können mit Tokenize eine bessere Lösung finden.

Liegt es daran, dass Jedi nicht glaubt, dass es sich um ein ErrorLeaf handelt, oder liegt es daran, dass das Zurückgehen um zwei Knoten nicht ausreicht?

Ich bin mir nicht sicher und habe mich schnell auf tokenize umgestellt, weil mir die Tatsache nicht gefallen hat, dass es sich um internes Jedi-Zeug (private API) handelt.

tokenize hat auch sein Problem. Was passiert, wenn die Zelle vor dem Öffnen der Zeichenfolge einen IndentationError oder SyntaxError auslöst?

Möglicherweise müssen Sie Zeilen schrittweise zurückverfolgen, aber dann erwarten Sie aufgrund der unvollständigen Zeichenfolgendeklaration immer einen Fehler in der Nähe des Cursors?

Mit Tokenize denke ich an eine einfache Logik, wie sie in inputtransformer2.py . Es gibt eine Logik, um zu wissen, ob der Benutzer eine Liste oder ein Wörterbuch in das Terminal eingibt, sodass Sie beim Drücken von enter den Code nicht ausführen und eine neue Zeile einfügen:
test1
test2
Vielleicht können wir etwas Äquivalentes mit den Zeichen " und ' versuchen (ich kann versuchen, eine PR zu entwickeln).

Eine andere Idee könnte sein, Regexp zu verwenden. In diesem Fall wäre ich jedoch nutzlos: P.

tokenize hat auch sein Problem. Was passiert, wenn die Zelle vor dem Öffnen der Zeichenfolge einen IndentationError oder SyntaxError auslöst?

Ich denke, es würde einfach nicht vollständig sein ... Wie ist das aktuelle Verhalten? Funktioniert die automatische Vervollständigung weiterhin, wenn Sie einen SyntaxError in Ihrem Code haben? Wir sollten nachsehen

Gleiches Problem nach dem Update auf 7.3.0.

Ja, es funktioniert, wenn Sie einen SyntaxError haben.

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

IIRC tokenize ist ziemlich robust in Bezug

Ich bin mir nicht sicher, was es mit so etwas wie einer nicht abgeschlossenen Zeichenfolge in der Zeile zuvor tun würde, was ein Syntaxfehler auf Tokenisierungsebene sein könnte.

Ähnliche Probleme mit der neuesten Conda-Installation:

python                    3.7.3
ipykernel                 5.1.0              
ipython                   7.4.0           

Ich bekomme eigentlich überhaupt keine Tab-Vervollständigung. Nur innerhalb einer Funktion (Shift + Double-Tab) erhalte ich den Docstring-Abschluss. Kein Methodenabschluss für Objekte. Das Eingeben von Pfaden innerhalb von Zeichenfolgen funktioniert wie erwartet, dh es werden keine globalen Variablen aufgelistet.

Das Problem bleibt in IPython 7.7.0, das über conda installiert wurde:

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

Und es wird so lange dauern, bis diese Ausgabe und # 10926 geschlossen sind. @ JeremySikes73 und ich haben dort einige Erklärungen gegeben, was falsch ist, und ich bin mir ziemlich sicher, dass das Problem dasselbe ist: IPythons Matcher geben alle Ergebnisse zurück, während wir entweder a) nur die relevanten ausführen oder b) den Matchern Code hinzufügen sollten Sie geben nichts zurück, wenn ihre Ergebnisse irrelevant wären.

Vielen Dank, dass Sie versucht haben zu helfen, aber ich denke, es ist produktiver, # 10926 zu lesen, in den Code einzutauchen und herauszufinden, wie Sie die Situation verbessern können, als zu sagen, dass es immer noch ein Problem ist.

@meeseeksdev Tag Hilfe gesucht

@meeseeksdev Tag Tab-Vervollständigung

Für diejenigen, die auf Probleme mit dem Downgrade gestoßen sind , fand @ivirshup am hilfreichsten - um die automatische Vervollständigung von jedi in der ipython-Konfiguration zu deaktivieren. Wenn Sie es noch nicht getan haben, können Sie ein ipython_config.py generieren mit:

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

Und ändern Sie c.IPCompleter.use_jedi = False in ipython_config.py

Welche Datei soll bearbeitet werden? ipython_kernel_config.py oder ipython_config.py ?

Eine vorübergehende Problemumgehung für dieses Problem besteht darin, nach dem Drücken der Tabulatortaste einen zweiten Schrägstrich anzuhängen.

Nach der Eingabe von '/<TAB>
image

Nach der Eingabe von /
image

Sobald ein Element ausgewählt ist, wird nur ein Schrägstrich als Trennzeichen angezeigt:

Nach dem Drücken der Eingabetaste
image

Beachten Sie, dass das Hinzufügen des zweiten Schrägstrichs vor dem Drücken der Tabulatortaste das Popup-Menü nicht ändert.

Ich habe ab heute (7.11.0) auf die neueste Version von ipython aktualisiert, und das Problem besteht weiterhin.

@ fliegende-Schafe @augustogoulart Sind Sie offen für Anfragen dazu? (Ich meine, das "helpwanted" -Tag schlägt dies vor, aber ich bin kein bestehender Mitwirkender, daher bin ich mir der Entwicklernormen hier nicht sicher.) Ich habe einige geringfügige Änderungen an der Logik bei der Erkennung, ob wir uns in einer Zeichenfolge befinden oder nicht , was zwar keine perfekte Lösung ist, aber zumindest dazu beiträgt, jedi besser auszuschalten.

Dies behebt # 10926 oder dies nicht vollständig, da es schön wäre, es auszuschalten (meiner Meinung nach):

  • Die Dateivervollständigung stimmt mit einer Wörterbuchschlüsselzeichenfolge überein
  • Die magische Vervollständigung stimmt mit einer beliebigen Zeichenfolge überein

Aber es schaltet zumindest jedi aus, wenn es sich in einer Zeichenfolge befindet, was einen großen Beitrag dazu leistet, dass meine eigenen Verwendungsmuster funktionsfähig sind.

Ich bin selbst nur ein kleiner Mitwirkender, aber ich wette, sie möchten Hilfe, um dies zu beheben!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen