Python 3 drukuje bez nawiasów

87

printKiedyś oświadczenie w Pythonie 2, ale teraz stało się to funkcja, która wymaga nawiasów w Pythonie 3.

Czy w ogóle można pominąć te nawiasy w Pythonie 3? Może przez ponowne zdefiniowanie funkcji drukowania?

Więc zamiast

print ("Hello stack over flowers")

Mógłbym wpisać:

print "Hello stack over flowers"
Laura
źródło
4
Czy jest jakiś konkretny powód, dla którego chcesz to zrobić? Czy jesteś po prostu ciekawy? Generalnie nie jest dobrą praktyką ponowne definiowanie słów kluczowych, nawet jeśli jest to możliwe.
Michael S Priz
6
Z ciekawości, dlaczego ludzie nie głosują? Nie rozumiem, jak to leży poza wytycznymi SO.
Michael S Priz
22
Używam Pythona 3. Jednak ciągłe pisanie ()jest niepotrzebnie czasochłonne.
Laura,
7
Michael, nie wydajesz się taki miły. Czy zrobiłem coś nie tak? Zadaję uczciwe pytanie, nawet jeśli brzmi to jak obejście standardów kodowania dla Ciebie. Gdyby był tak „standardowy”, nie zmieniliby go w Pythonie 3, prawda?
Laura
4
Przypuszczam, że powinienem był powiedzieć „specyfikacje językowe” :) Przepraszam, jeśli cokolwiek, co powiedziałem, było obraźliwe. Próbuję tylko pomóc Ci jak najlepiej wykorzystać SO.
Michael S Priz

Odpowiedzi:

26

Chociaż do drukowania w Pythonie 3 potrzebujesz pary nawiasów, nie potrzebujesz już spacji po print, ponieważ jest to funkcja. Więc to tylko jeden dodatkowy znak.

Jeśli nadal uważasz, że wpisanie jednej pary nawiasów jest „niepotrzebnie czasochłonne”, możesz to zrobić p = printi zaoszczędzić w ten sposób kilka znaków. Ponieważ możesz powiązać nowe odniesienia z funkcjami, ale nie ze słowami kluczowymi, ten printskrót możesz wykonać tylko w Pythonie 3.

Python 2:

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

Python 3:

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

Dzięki temu kod będzie mniej czytelny, ale za każdym razem, gdy coś wydrukujesz, zaoszczędzisz tych kilka znaków.

TigerhawkT3
źródło
Dziękuję TigerhawkT3. Tak, zaoszczędziłoby to czas, ale tak jak powiedziałeś, sprawi, że kod będzie mniej czytelny.
Laura
@Tigerhawk To obejście nie jest zgodne z IDE
Chandra Shekhar
2
@ChandraShekhar - What IDE? O czym mówisz? Nie ma powodu, aby miał na to wpływ wybór IDE.
TigerhawkT3
1
@ TigerhawkT3 Próbowałem tego samego w Eclipse, gdzie nie zadziałało
Chandra Shekhar
5
@ChandraShekhar - W jaki sposób jest to „niezgodne”? Co się stanie, gdy spróbujesz?
TigerhawkT3
8

Używanie printbez nawiasów w kodzie Pythona 3 nie jest dobrym pomysłem. Nie tworzy też aliasów itp. Jeśli to łamie umowę, użyj Pythona 2.

Jednak printbez nawiasów może być przydatne w powłoce interaktywnej. Tak naprawdę nie chodzi o zmniejszenie liczby znaków, ale raczej o uniknięcie konieczności dwukrotnego naciskania klawisza Shift za każdym razem, gdy chcesz coś wydrukować podczas debugowania. IPython umożliwia wywoływanie funkcji bez używania nawiasów, jeśli zaczynasz linię ukośnikiem:

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

A jeśli włączysz autocall, nie będziesz musiał nawet wpisywać ukośnika:

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

In [4]: print var
------> print(var)
Hello world
michau
źródło
Używanie Pythona 2 jako alternatywy, jak sugeruje post, wkrótce nie będzie już możliwe.
Arnaud
6

Użyj Autohotkey, aby zrobić makro. AHK jest darmowy i prosty w instalacji. www.autohotkey.com

Możesz przypisać makro do, powiedzmy, alt-p:

!p::send print(){Left}

To spowoduje, że alt-p wypisze print () i przeniesie kursor do wewnątrz parenów.

Lub jeszcze lepiej, aby bezpośrednio rozwiązać problem, definiujesz automatyczną zamianę i ograniczasz jej zakres do sytuacji, gdy otwarty plik ma rozszerzenie .py:

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

To gwarantowane, bezbolesne, przejrzyste rozwiązanie.

Harry Binswanger
źródło
4

Nie. To zawsze będzie błąd składni w Pythonie 3. Rozważ użycie 2to3do przetłumaczenia kodu na Python 3

holdenweb
źródło
11
Używam Pythona 3. Chcę tylko unikać ciągłego wpisywania nawiasów. shift+ 9..... potem znowu shift+ 0jest wyczerpujące.
Laura
Przepraszamy, że wywołania funkcji utrudniają Ci pisanie. Sam jestem dość kiepską maszynistką, więc chociaż nie jestem fizycznie upośledzona, robię, co mogę, aby zminimalizować użycie przesuniętych klawiszy.
holdenweb
Najwyraźniej nikt nie docenia prostoty strzałki W GÓRĘ podczas korzystania z funkcji przypominania historii basha. To proste. W ten sam sposób printpowinno być wolne od bezużytecznych technik debugowania, takich jak para nawiasów.
John Greene,
Istnieją argumenty przemawiające za tym, które zostały szeroko przećwiczone przed wprowadzeniem Pythona 3. Chociaż dodatkowe nawiasy mogą być niewygodne dla nas, biednych maszynistek, uważam, że elastyczność oferowana przez możliwość przedefiniowania printbyła tego warta.
holdenweb
4

Skrypt AHK to świetny pomysł. Tylko dla zainteresowanych musiałem to trochę zmienić, aby działało dla mnie:

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
źródło
1

Nie możesz, ponieważ jedynym sposobem na zrobienie tego bez nawiasów jest użycie słowa kluczowego, jak w Pythonie 2. Nie możesz ręcznie zdefiniować słowa kluczowego, więc nie.


źródło
1

W końcu wymyśliłem wyrażenie regularne, aby zmienić to wszystko w starych przykładowych skryptach Python2. W przeciwnym razie użyj 2to3.py.

Wypróbuj na Regexr.com, nie działa w NP ++ (?):

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

dla zmiennych:

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

dla etykiety i zmiennej:

(?<=print)( ')(.*)(',)(.*)(\n)
('$2',$4)\n
alchemia
źródło
1
Oto wyrażenie regularne, które działa w NP ++(?<=print)( ')(.*)(') \('$2'\)
Jack
Dzięki @Jack, trzeba było uciec od nawiasów (tylko w zamian?). Dobrze wiedzieć. Znalazłem również częściowo pokrewną sztuczkę, którą Py3 rozpoznaje, że ma spację między print ('string'), aby łatwiej było podświetlić plik do druku, a następnie użyć automatycznego zamykania wielu redaktorów, aby dodać nawiasy, a następnie cytaty.
alchemia
0

W Pythonie 3 print jest funkcją, podczas gdy w poprzednich wersjach była instrukcją. Jak zasugerował @holdenweb, użyj 2to3, aby przetłumaczyć swój kod.

SPKB24
źródło