Python 3-Druck ohne Klammern

86

Die printfrüher ein Statement in Python 2, aber jetzt wurde es eine Funktion , die Klammer in Python 3 erfordert.

Gibt es überhaupt eine Möglichkeit, diese Klammern in Python 3 zu unterdrücken? Vielleicht durch Neudefinition der Druckfunktion?

Also statt

print ("Hello stack over flowers")

Ich könnte tippen:

print "Hello stack over flowers"
Laura
quelle
4
Gibt es einen bestimmten Grund, warum Sie dies tun möchten? Oder bist du nur neugierig? Es ist in der Regel keine gute Praxis neu zu definieren Schlüsselwörter , auch wenn es ist möglich.
Michael S Priz
6
Warum stimmen die Leute aus Neugier ab? Ich verstehe nicht, wie es außerhalb der SO-Richtlinien liegt.
Michael S Priz
21
Ich verwende Python 3. Das ständige Tippen ()ist jedoch unnötig zeitaufwändig.
Laura
7
Michael, du scheinst nicht so nett zu sein. Habe ich etwas falsch gemacht? Ich stelle eine ehrliche Frage, auch wenn dies für Sie nach einer Problemumgehung für Codierungsstandards klingt. Wenn es so "Standard" wäre, würden sie es in Python 3 nicht ändern, oder?
Laura
4
Ich hätte wohl "Sprachspezifikationen" sagen sollen :) Ich entschuldige mich, wenn etwas, was ich sagte, als anstößig empfunden wurde. Ich versuche nur, Ihnen zu helfen, das Beste aus SO herauszuholen.
Michael S Priz

Antworten:

26

Obwohl Sie zum Drucken in Python 3 zwei Klammern benötigen, benötigen Sie danach kein Leerzeichen mehr print, da es sich um eine Funktion handelt. Das ist also nur ein einziges zusätzliches Zeichen.

Wenn Sie immer noch feststellen, dass das Eingeben eines einzelnen Klammerpaars "unnötig zeitaufwändig" ist, können Sie auf p = printdiese Weise einige Zeichen speichern. Da Sie neue Verweise an Funktionen, jedoch nicht an Schlüsselwörter binden können, können Sie diese printVerknüpfung nur in Python 3 ausführen.

Python 2:

>>> p = print
  File "<stdin>", line 1
    p = print
            ^
SyntaxError: invalid syntax

Python 3:

>>> p = print
>>> p('hello')
hello

Dadurch wird Ihr Code weniger lesbar, aber Sie speichern diese wenigen Zeichen jedes Mal, wenn Sie etwas drucken.

TigerhawkT3
quelle
Vielen Dank, dass Sie TigerhawkT3. Ja, dies würde Zeit sparen, aber wie Sie sagten, wird der Code dadurch weniger lesbar.
Laura
@ Tigerhawk Diese Problemumgehung ist nicht kompatibel mit IDE
Chandra Shekhar
2
@ChandraShekhar - Welche IDE? Worüber redest du? Es gibt keinen Grund, dies durch die Wahl der IDE zu beeinflussen.
TigerhawkT3
1
@ TigerhawkT3 Ich habe das gleiche in Eclipse versucht, wo es nicht funktioniert hat
Chandra Shekhar
5
@ChandraShekhar - Und inwiefern ist es "nicht kompatibel"? Was passiert, wenn Sie es versuchen?
TigerhawkT3
7

Die Verwendung printohne Klammern in Python 3-Code ist keine gute Idee. Es werden auch keine Aliase usw. erstellt. Wenn dies ein Deal Breaker ist, verwenden Sie Python 2.

Allerdings printohne Klammern können in dem interaktiv Shell nützlich sein. Es geht nicht wirklich darum, die Anzahl der Zeichen zu verringern, sondern die Notwendigkeit zu vermeiden, jedes Mal zweimal die Umschalttaste zu drücken, wenn Sie beim Debuggen etwas drucken möchten. Mit IPython können Sie Funktionen ohne Klammern aufrufen, wenn Sie die Zeile mit einem Schrägstrich beginnen:

Python 3.6.6 (default, Jun 28 2018, 05:43:53)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.4.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: var = 'Hello world'

In [2]: /print var
Hello world

Und wenn Sie sich einschalten autocall, müssen Sie nicht einmal den Schrägstrich eingeben:

In [3]: %autocall
Automatic calling is: Smart

In [4]: print var
------> print(var)
Hello world
michau
quelle
Die Verwendung von Python 2 als Alternative, wie im Beitrag vorgeschlagen, ist bald nicht mehr möglich.
Arnaud
6

Verwenden Sie den Autohotkey, um ein Makro zu erstellen. AHK ist kostenlos und kinderleicht zu installieren. www.autohotkey.com

Sie können das Makro beispielsweise alt-p zuweisen:

!p::send print(){Left}

Dadurch löscht alt-p print () und bewegt den Cursor in die Parens.

Oder, noch besser, um Ihr Problem direkt zu lösen, definieren Sie einen Autoreplace und beschränken seinen Umfang darauf, wann die geöffnete Datei die Erweiterung .py hat:

#IfWinActive .py            ;;; scope limiter
:b*:print ::print(){Left}   ;;; I forget what b* does. The rest should be clear 
#IfWinActive                ;;; remove the scope limitation

Dies ist eine garantierte, schmerzlose und transparente Lösung.

Harry Binswanger
quelle
4

Nein. Dies ist in Python 3 immer ein Syntaxfehler. Verwenden 2to3Sie möglicherweise , um Ihren Code in Python 3 zu übersetzen

holdenweb
quelle
11
Ich verwende Python 3. Ich möchte nur vermeiden, ständig Klammern einzugeben. shift+ 9..... dann wieder shift+ 0ist erschöpfend.
Laura
Entschuldigung, dass die Funktionsaufrufe Ihnen die Eingabe erschweren. Ich bin selbst eine ziemlich beschissene Schreibkraft. Obwohl ich keine körperliche Behinderung habe, tue ich alles, um die Verwendung von verschobenen Tasten zu minimieren.
Holdenweb
Anscheinend weiß niemand die Einfachheit des UP-Pfeils zu schätzen, wenn er den Bash-Verlaufsrückruf verwendet. Es ist einfach. Ebenso printsollte es nicht durch nutzlose Debugging-Techniken wie ein Paar Klammern belastet werden.
John Greene
Dafür gibt es Argumente, die vor der Einführung von Python 3 ausgiebig einstudiert wurden. Während die zusätzlichen Klammern für uns arme Schreibkräfte unpraktisch sein mögen, hat sich die Flexibilität, die die Fähigkeit zur Neudefinition bietet print, meiner Meinung nach gelohnt.
Holdenweb
4

Das AHK-Skript ist eine großartige Idee. Nur für Interessierte musste ich es ein wenig ändern, um für mich zu arbeiten:

SetTitleMatchMode,2         ;;; allows for a partial search 
#IfWinActive, .py           ;;; scope limiter to only python files
:b*:print ::print(){Left}   ;;; I forget what b* does
#IfWinActive                ;;; remove the scope limitation
TokyoMike
quelle
1

Dies ist nicht möglich, da Sie dies nur ohne Klammern tun können, indem Sie ein Schlüsselwort wie in Python 2 verwenden. Sie können ein Schlüsselwort nicht manuell definieren, also nein.


quelle
1

Ich habe endlich die Regex herausgefunden, um diese alle in alten Python2-Beispielskripten zu ändern. Verwenden Sie andernfalls 2to3.py.

Probieren Sie es auf Regexr.com aus, funktioniert nicht in NP ++ (?):

find:     (?<=print)( ')(.*)(')
replace: ('$2')

für Variablen:

(?<=print)( )(.*)(\n)
('$2')\n

für Label und Variable:

(?<=print)( ')(.*)(',)(.*)(\n)
('$2',$4)\n
Alchimie
quelle
Hier ist eine Regex, die in NP ++ funktioniert(?<=print)( ')(.*)(') \('$2'\)
Jack
Danke @Jack, musste aus den Klammern entkommen (nur ersetzen?) .. gut zu wissen. Außerdem habe ich einen halbbezogenen Trick gefunden, bei dem Py3 erkennt, dass ein Leerzeichen dazwischen liegt print ('string'), damit der Ausdruck leichter hervorgehoben werden kann, und dann das automatische Schließen vieler Editoren verwendet, um die Klammern und dann Anführungszeichen hinzuzufügen.
Alchemie
0

In Python 3 ist print eine Funktion, während es in früheren Versionen eine Anweisung war. Verwenden Sie, wie @holdenweb vorgeschlagen hat, 2to3 , um Ihren Code zu übersetzen.

SPKB24
quelle