Печать Python 3 без скобок


87

printРаньше заявление в Python 2, но теперь она стала функцией , которая требует скобки в Python 3.

Есть ли способ убрать эти скобки в Python 3? Может быть, переопределив функцию печати?

Итак, вместо

print ("Hello stack over flowers")

Я мог напечатать:

print "Hello stack over flowers"

4
Есть ли конкретная причина, по которой вы хотите это сделать? Или тебе просто любопытно? Это , как правило , не хорошая практика , чтобы ключевые слова переопределить даже если это возможно.
— Michael S Priz

6
Из любопытства, почему люди голосуют против? Я не понимаю, как это выходит за рамки рекомендаций SO.
— Michael S Priz

22
Я использую Python 3. Однако постоянный набор текста ()занимает излишне много времени.
— Лаура

7
Майкл, ты не выглядишь таким добрым. Я сделал что-то не так? Я задаю честный вопрос, даже если это звучит для вас как обходные стандарты кодирования. Если бы он был таким «стандартным», они бы не изменили его в Python 3, не так ли?
— Лаура

4
Полагаю, мне следовало сказать "языковые спецификации" :) Прошу прощения, если что-то, что я сказал, показалось мне оскорбительным. Я только пытаюсь помочь вам получить от SO по максимуму.
— Michael S Priz

Ответы:


26

Хотя вам нужна пара круглых скобок для печати в Python 3, вам больше не нужен пробел print, потому что это функция. Так что это всего лишь один лишний символ.

Если вы по-прежнему находите набор одной пары круглых скобок «излишне трудоемким», вы можете сделать p = printи сохранить несколько символов таким образом. Поскольку вы можете связывать новые ссылки с функциями, но не с ключевыми словами, вы можете делать это только printв Python 3.

Python 2:

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

Python 3:

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

Это сделает ваш код менее читабельным, но вы будете сохранять эти несколько символов каждый раз, когда что-то печатаете.


Спасибо, TigerhawkT3. Да, это сэкономит время, но, как вы сказали, это сделает код менее читабельным.
— Лаура

@Tigerhawk Этот обходной путь несовместим с IDE
— Чандра Шекхар

2
@ChandraShekhar - Какая IDE? О чем ты говоришь? Нет причин, по которым на это влияет выбор IDE.
— TigerhawkT3,

1
@ TigerhawkT3 Я пробовал то же самое в Eclipse, где это не сработало
— Чандра Шекхар

5
@ChandraShekhar - А в чем "несовместимость"? Что произойдет, если вы попробуете?
— TigerhawkT3,

8

Использование printбез скобок в коде Python 3 - не лучшая идея. Также не создаются псевдонимы и т. Д. Если это мешает, используйте Python 2.

Однако printбез скобок может быть полезно в интерактивной оболочке. На самом деле речь идет не об уменьшении количества символов, а о том, чтобы избежать необходимости дважды нажимать Shift каждый раз, когда вы хотите что-то напечатать во время отладки. IPython позволяет вызывать функции без использования скобок, если вы начинаете строку с косой черты:

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

И если вы включите autocall , то даже косую черту набирать не нужно:

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

In [4]: print var
------> print(var)
Hello world

Использование python 2 в качестве альтернативы, как предлагается в сообщении, скоро станет невозможным.
— Арно

6

Используйте Autohotkey для создания макроса. AHK бесплатен и очень прост в установке.www.autohotkey.com

Вы можете назначить макрос, скажем, alt-p:

!p::send print(){Left}

Это заставит alt-p выдать print () и переместить курсор внутрь скобок.

Или, что еще лучше, чтобы напрямую решить вашу проблему, вы определяете автоматическую замену и ограничиваете ее область действия, когда открытый файл имеет расширение .py:

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

Это гарантированное, безболезненное, прозрачное решение.


4

Нет. Это всегда будет синтаксической ошибкой в ​​Python 3. Рассмотрите 2to3возможность перевода кода на Python 3.


11
Я использую Python 3. Я просто не хочу постоянно набирать скобки. shift+ 9..... опять же shift+ 0исчерпывающий.
— Лаура,

Извините, что вызовы функций затрудняют набор текста. Я сама довольно дрянная машинистка, поэтому, хотя у меня нет никаких физических недостатков, я делаю все возможное, чтобы свести к минимуму использование сдвинутых клавиш.
— holdenweb

По-видимому, никто не оценит простоту стрелки ВВЕРХ при использовании bash «отзыва истории». Это просто. Точно так же printон не должен быть обременен бесполезными методами отладки, такими как пара круглых скобок.
— Джон Грин

Есть аргументы в пользу этого, которые широко обсуждались до появления Python 3. Хотя лишние скобки могут быть неудобными для нас, бедных машинисток, гибкость, предлагаемая возможностью переопределения print, я считаю, того стоит.
— holdenweb

4

Скрипт AHK - отличная идея. Просто для тех, кто заинтересован, мне нужно было немного изменить его, чтобы он работал на меня:

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

1

Вы не можете, потому что единственный способ сделать это без скобок - сделать это ключевым словом, как в Python 2. Вы не можете вручную определить ключевое слово, поэтому нет.


1

Я наконец придумал регулярное выражение, чтобы изменить все это в старых сценариях примера Python2. В противном случае используйте 2to3.py.

Попробуйте на Regexr.com, не работает в NP ++ (?):

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

для переменных:

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

для метки и переменной:

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

1
Вот регулярное выражение, которое работает в NP ++(?<=print)( ')(.*)(') \('$2'\)
— Джек

Спасибо, @Jack, нужно убрать скобки (просто для замены?). Полезно знать. Кроме того, я обнаружил наполовину связанный трюк, в котором Py3 распознает наличие пробела между ними print ('string'), чтобы можно было легче выделить печатный текст, а затем использовать автоматическое закрытие многих редакторов, чтобы добавить круглые скобки, а затем кавычки.
— алхимия

0

В Python 3 print - это функция, тогда как в предыдущих версиях она была выражением. Как предложил @holdenweb, используйте 2to3 для перевода вашего кода.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.