Почему в Python 2.7 круглые скобки являются добровольными - PullRequest
94 голосов
/ 31 мая 2011

В Python 2.7 оба следующие действия будут делать то же самое

print("Hello, World!") # Prints "Hello, World!"

print "Hello, World!" # Prints "Hello, World!"

Однако следующее не будет

print("Hello,", "World!") # Prints the tuple: ("Hello,", "World!")

print "Hello,", "World!" # Prints the words "Hello, World!"

В Python 3.x скобка на print обязательна, по сути, делает ее функцией, но в 2.7 оба будут работать с разными результатами. Что еще я должен знать о print в Python 2.7?

Ответы [ 4 ]

102 голосов
/ 31 мая 2011

В Python 2.x print на самом деле является специальным оператором, а не функцией *.

Вот почему его нельзя использовать, например: lambda x: print x

Примечание(expr) не создает кортеж (это приводит к expr), но , создает.Это, вероятно, приводит к путанице между print (x) и print (x, y) в Python 2.7

(1)   # 1 -- no tuple Mister!
(1,)  # (1,)
(1,2) # (1, 2)
1,2   # 1 2 -- no tuple and no parenthesis :) [See below for print caveat.]

Однако, поскольку print представляет собой специальный синтаксический оператор / конструкцию грамматики в Python 2.x затем без скобок он обрабатывает , особым образом - и не создает кортеж.Эта специальная обработка оператора print позволяет ему действовать по-другому, если есть конечный код , или нет.

Счастливое кодирование.


* Такое поведение print вPython 2 может быть изменен на Python 3:

from __future__ import print_function
5 голосов
/ 15 августа 2012

Здесь у нас есть интересный побочный эффект, когда дело доходит до UTF-8.

>> greek = dict( dog="σκύλος", cat="γάτα" )
>> print greek['dog'], greek['cat']
σκύλος γάτα
>> print (greek['dog'], greek['cat'])
('\xcf\x83\xce\xba\xcf\x8d\xce\xbb\xce\xbf\xcf\x82', '\xce\xb3\xce\xac\xcf\x84\xce\xb1')

Последний вывод кортежа с шестнадцатеричными байтовыми значениями.

3 голосов
/ 31 мая 2011

Все очень просто и не имеет ничего общего с прямой или обратной совместимостью.

Общая форма оператора print во всех версиях Python до версии 3:

print expr1, expr2, ... exprn

(Каждое выражение в свою очередь оценивается, преобразуется в строку и отображается с пробелом между ними.)

Но помните, что заключение в скобки вокруг выражения остается тем же выражением.

Таким образом, вытакже можно записать это как:

print (expr1), (expr2), ... (expr3)

Это не имеет ничего общего с вызовом функции.

2 голосов
/ 31 мая 2011

В основном в Python до Python 3 print была специальным оператором, который выводил все строки, если они получены в качестве аргументов.Так что print "foo","bar" просто означало «напечатать« foo », а затем« bar »».Проблема с этим заключалась в том, что было заманчиво действовать так, как будто print была функцией, и грамматика Python неоднозначна в этом отношении, поскольку (a,b) - это кортеж, содержащий a и b, но foo(a,b) - это вызовфункция двух аргументов.

Таким образом, они сделали несовместимое изменение для 3, чтобы сделать программы менее двусмысленными и более регулярными.

(На самом деле, я думаю, что 2.7 ведет себя так же, как 2.6, но ям не уверен.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...