Ipython: In ipython können keine mehrzeiligen Codeblöcke erstellt werden

Erstellt am 27. Sept. 2018  ·  26Kommentare  ·  Quelle: ipython/ipython

Ich habe gerade beim Unterrichten einer Klasse heute ein pip install ipython und eine if-Anweisung eingegeben und dann nach der ersten Zeile die Eingabetaste gedrückt und den Code ausgeführt.

Dies scheint ein Fehler zu sein.

Ich habe ein pip install ipython==6.5.0 und durch Drücken der Eingabetaste in einem Codeblock wurde mir die nächste eingerückte Zeile angezeigt, die ich eingeben musste.

Ich bin auf Ubuntu 18.04 und führe ipython unter tmux aus, obwohl ich bezweifle, dass tmux hier das Problem ist.

Hacktoberfest help wanted

Hilfreichster Kommentar

Eigentlich habe ich mit meinem Fix eine Regression bekommen. Jetzt reparieren.

Die PR # 11354 ist jetzt aktualisiert.

Alle 26 Kommentare

Sie können ctrl-o , um eine neue Zeile zu erzwingen.

Ich hätte das nie gedacht. Ich bin mir nicht sicher, wie ich das klarer machen soll, aber ich denke, es erfordert eine Klarstellung / Handhaltung. Ich habe jede erdenkliche Verknüpfung ausprobiert und schließlich ein Downgrade erzwungen, um mein Problem zu beheben.

Ich verwende IPython, um das Schreiben und Bearbeiten mehrzeiliger Blöcke in der REPL zu vereinfachen und gleichzeitig das Live-Publikum zu unterrichten. Ich vermute, dass andere in meiner Situation ähnliche Probleme haben könnten.

Vielleicht eine Warnung irgendwo, die darauf hinweist, dass Strg-O verwendet werden kann, um einen mehrzeiligen Codeblock zu erstellen? Ich bin mir nicht sicher, ob es dafür einen geeigneten Ort gibt.

Es ist ein Fehler mit einem kürzlich durchgeführten Refactor. Ich habe nur versucht, Ihnen zu sagen, dass Sie in der Zwischenzeit Strg-O verwenden können, wenn Sie 7.x verwenden möchten

Ah gut! Ich bin froh, dass es nur ein Fehler war. Danke @Carreau! 😄

Würde es Ihnen etwas ausmachen, mir ein paar Beispiele (Arbeiten und nicht Arbeiten) von dem zu geben, was Sie erwarten, um die Korrekturen zu testen?

Ich habe einige, sammle aber nur ein paar und möchte dich nicht beeinflussen.

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

Ich kann mich nicht an das zweite Beispiel erinnern, aber an eine Reihe von Schleifen:

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

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

@Carreau arbeitet jemand an diesem Problem? Ich würde gerne helfen

hi @ Deborah-Digges, ich habe einen kurzen Blick darauf geworfen, aber bisher nicht zu viel.

Ich habe diesen kleinen Testfall geschrieben, um den Unterschied zwischen dem alten input_splitter und dem neuen input_transformer zu erkennen:

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

Welches Ergebnis in

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

Sie sehen, dass der dritte Punkt derjenige ist, der uns interessiert. Die zweite war aus Neugierde, da eine der "Funktionen" von IPython darin besteht, die Ausführung zu erzwingen, wenn mehr als zwei Zeilenumbrüche vorhanden sind.

Ein Teil des relevanten Codes befindet sich in shortcut.py:L109-L127 .

Ich denke, es gibt eine Art Konflikt zwischen der Rolle der Definition, ob eine Codeprüfung "vollständig" ist oder ob wir "eine neue Zeile ausführen oder hinzufügen" sollen.

Ich vermute, dass die Heuristik, die prüft, ob die Eingabe mehrzeilig ist und ob das letzte Zeichen bereits eine neue Zeile ist oder nicht, ausreichen sollte.

Eine der verbleibenden Fragen ist, wo das Problem behoben werden soll.

  • in shortcut.py ? In diesem Fall wird nur das Terminal IPython repariert
  • in input_transformer2? Ich denke, das könnte die richtige Lösung sein, wird aber wahrscheinlich auch QtConsole betreffen.

Lassen Sie mich wissen, ob das ausreicht, um Ihnen zumindest den Einstieg zu erleichtern.

Vielen Dank !

Hallo @Carreau ! Vielen Dank für die ausführlichen Erklärungen und Testfälle.

Ich konnte es lokal mit der Entwicklerversion von ipython reproduzieren und werde nun den Code für shortcut.py und inputtransformer .

Würde es Ihnen etwas ausmachen, mir ein paar Beispiele (Arbeiten und nicht Arbeiten) von dem zu geben, was Sie erwarten, um die Korrekturen zu testen?

Sie brauchen nicht ein paar Beispiele. Der Fehler tritt auf sehr reproduzierbare Weise auf.
Mehrzeilig funktioniert nur, wenn die Zeile mit einem Doppelpunkt endet. Wenn am Zeilenende kein Doppelpunkt steht, führt iPython Code aus. Das sieht mit diesen Informationen etwas trivialer aus, hat aber nie in den iPython-Quellcode geschaut, also bin ich hier vielleicht etwas zu optimistisch;)

iPython

Großbuchstaben Ich bitte, wir wollen keine Probleme mit Apfel.

Sie brauchen nicht ein paar Beispiele

Nun, nein, ich brauche es nicht, aber ich möchte mehrere Beispiele. Ich kann reproduzieren und habe eine Idee, wie ich das Problem beheben kann, aber wenn ich mehrere Fälle habe, kann ich sicher sein, dass ich keinen Randfall treffe. Ich habe eine voreingenommene Sicht auf die Verwendung von IPython, daher sind Beispiele von anderen hilfreich.

iPython
Großbuchstaben Ich bitte, wir wollen keine Probleme mit Apfel.

Zumindest habe ich herausgefunden, warum es das obere Ich im Namen gibt, danke und sorry :)

Als Entschuldigung hier eine Pull-Anfrage Nr. 11354, die dieses (Haupt-) Problem behebt. IMHO ist dies ein blockierender Fehler für IPython. Sie sollten in Betracht ziehen, bald eine Veröffentlichung zu veröffentlichen (sehen Sie, wie viele Probleme bei Github von Benutzern in Bezug darauf erstellt werden).

Zumindest habe ich herausgefunden, warum es das obere Ich im Namen gibt, danke und sorry :)

Dies ist nicht der (einzige) Grund, da IPython 0.1 vor dem ersten iProduct veröffentlicht wurde, aber normalerweise erinnern sich die Leute daran

Als Entschuldigung hier eine Pull-Anfrage Nr. 11354, die dieses (Haupt-) Problem behebt.

danke Ich werde mal schauen, wenn es die Zeit erlaubt

Sie sollten in Betracht ziehen, bald eine Veröffentlichung zu machen

Ja, sobald ein Freiwilliger Zeit hat, werden wir das tun. Es gibt noch andere kritische Probleme wie die Veröffentlichung von jupyter_console, und ich glaube, niemand hier kann ein paar Stunden auf $ DAYJOB brauchen, um dies zu tun. Es muss also möglicherweise auf dieses Wochenende warten.

Eigentlich habe ich mit meinem Fix eine Regression bekommen. Jetzt reparieren.

Eigentlich habe ich mit meinem Fix eine Regression bekommen. Jetzt reparieren.

Die PR # 11354 ist jetzt aktualisiert.

Vielen Dank für das Update. Gibt es eine Idee, wann dies veröffentlicht wird? Ich verwende vim-Tastenkombinationen für STRG-O funktioniert bei mir nicht (ESC + o funktioniert ...)

Vielen Dank für das Update. Gibt es eine Idee, wann dies veröffentlicht wird?

Das wird einer der Freiwilligen im Projekt sein, der ein paar freie Stunden bekommt, um die wenigen verbleibenden Probleme für 7.1 zu untersuchen und eine Veröffentlichung zu machen. Ich hoffe, dass ich an diesem Wochenende vielleicht ein paar Stunden Zeit habe, aber das reicht möglicherweise nicht aus.

Jede Hilfe beim Testen / Überprüfen / Markieren der vorhandenen PRs / Probleme wäre hilfreich.

Mit den Blöcken async with immer noch reproduzierbar, habe sowohl den aktuellen Master-Zweig als auch v7.1.1 von PyPI ausprobiert.

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

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

Hum, das ist wahrscheinlich eine seltsame Interaktion mit Autoawait.

Oh, ich hätte nicht gedacht, dass es mit diesem Problem zusammenhängen würde. Der Grund, warum es fehlschlägt, ist, dass wir es haben

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

Es wird check_complete an jedem Zeilenende ausgeführt, das wiederum compile_command ausführt, und letzteres löst SyntaxError da 'async with' außerhalb der async-Funktion verwendet wird .
In meiner Gabel habe ich gerade SyntaxError stummgeschaltet, aber es ist sicherlich nicht der beste Weg, das zu beheben, lol.

Mögliche Lösungen / Ideen:

  • sollte prüfen, ob autoawait ist. Wenn dies der Fall ist, könnte dieser spezielle Fall SyntaxError ignoriert werden. Ich denke nicht, dass es eine gute Lösung ist, aber vielleicht mache ich die Dinge auch zu kompliziert.

  • Wenn das Autoawait eingeschaltet ist, füttern Sie die compile_command() mit dem Code, der mit den _asyncify() umwickelt ist. Ich denke, auf diese Weise werden nicht SyntaxError erhöht, aber ich bin nicht sicher, ob das Newline-Problem behoben wird, da _asyncify() selbst einige Einrückungsstufen hinzufügt und es leicht chaotisch werden kann.

  • Vielleicht kann _AsyncSyntaxErrorVisitor jedem helfen? Aber ich denke, es ist umgekehrt

Es tut mir leid für den Mangel an Engagement, ich würde die PR einreichen, aber ich hasse es, Tests zu schreiben und so weiter und auch nicht sicher, wie ich das besser beheben kann. Aber ich hoffe, es ist immer noch nützlich für jemanden.

Wir könnten so etwas wie versuchen , dies auch.

Das ist dein Punkt Nr. 2, und es ist in der Tat hässlich. Die Newline funktioniert. Was gut wäre, wäre eine angemessene Unterstützung in CPython.

Ist dieses Problem noch ungelöst? Ich glaube, ich habe diesen Fehler entdeckt ...

Dies ist heute zum ersten Mal der Fall (während einer Demo mit einem Client, als ich versuchte zu demonstrieren, was ein Generator in Python ist !!!).

Mache ich etwas falsch oder was soll ich tun, um mehrzeilige Codeblöcke zu schreiben (außer CTRL-o-Problemumgehung)?

Erwartetes Ergebnis wie in der Standard-Python-REPL gezeigt:

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

Ergebnis heute, wenn ich dasselbe in eine iPython REPL eingebe:

(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]:      

Der iPython REPL rückt die zweite Zeile wie erwartet automatisch ein. Wenn ich jedoch am Ende der zweiten Zeile enter eingebe, werden die beiden Zeilen ausgeführt, anstatt eine optionale dritte Zeile bereitzustellen.

Wie oben beschrieben, kann ich das gewünschte Ergebnis erzielen, indem ich STRG-o drücke, anstatt in der zweiten Zeile die Eingabetaste zu drücken:

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

IPython 7.0.1 - ...

Bitte aktualisieren Sie Ihr IPython. Dieses Problem ist behoben. Es gibt nur noch einen Randfall mit asynchronem Code.

Oh, das tut mir leid. Ich dachte ich hätte. Nach conda update ipython bekomme ich # All requested packages already installed.

Entschuldigung, ich bin ein bisschen verwirrt. Was ist die neueste Version und wie aktualisiere ich darauf?

Es hängt davon ab, wie Sie es installiert haben. Ich würde vorschlagen, es mit pip install zu versuchen, um zu sehen, ob dies funktioniert. Möglicherweise arbeiten Sie aber auch in einer Umgebung.

Wenn so etwas passiert ist, versuche ich, es aggressiv zu deinstallieren, bis ich IPython nicht mehr starten und dann neu installieren kann.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen