В чем преимущество новой функции печати в Python 3.x над оператором печати Python 2? - PullRequest
67 голосов
/ 05 июня 2011

Я несколько раз слышал, что print, являющаяся функцией (3.x), лучше, чем выражение (2.x). Но почему?

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

Мне было бы интересно увидеть некоторые ситуации, когда оператор print просто не обрезает его, а функция лучше.

Ответы [ 5 ]

53 голосов
/ 05 июня 2011

Обоснование

Заявление о печати давно появилось в списках сомнительных языковых функций, которые должны быть удалены в Python 3000, таких как презентация Гвидо «Сожаления о Python» [1] .Таким образом, цель этого PEP не нова, хотя она может стать предметом споров среди разработчиков Python.

Следующие аргументы для функции print () взяты из сообщения python-3000 самим Гвидо [2] :

  • print - единственная функциональность уровня приложения, для которой выделено утверждение.В мире Python синтаксис обычно используется в качестве крайней меры, когда что-то не может быть без помощи компилятора.Печать не подходит для такого исключения.
  • В какой-то момент разработки приложения нередко возникает необходимость заменить вывод на печать чем-то более сложным, таким как запись вызовов или вызовов в какую-либо другую библиотеку ввода / вывода.С функцией print () это простая замена строки, сегодня это беспорядок, добавляющий все эти скобки и, возможно, конвертирующий >> синтаксис стиля потока.
  • Наличие специального синтаксиса для печати создает гораздо больший барьер дляэволюция, например, гипотетическая новая функция printf () не слишком далеко выбирается, когда она сосуществует с функцией print ().
  • Нет простого способа преобразовать операторы print в другой вызов, если требуется другой разделитель,не пробелы, или вообще ничего.Кроме того, нет простого способа для удобной печати объектов с использованием какого-либо другого разделителя, кроме пробела.
  • Если функция print () является функцией, ее будет гораздо проще заменить внутри одной.модуль (просто def print(*args):...) или даже во всей программе (например, добавив другую функцию в __builtin__.print).На самом деле, это можно сделать, написав класс с методом write () и присвоив его sys.stdout - это неплохо, но, безусловно, это гораздо больший концептуальный скачок, и он работает на другом уровне, чем print.

- PEP 3105 - Сделать печать функцией

42 голосов
/ 05 июня 2011

Все от ответ Йохена и ответ Свена , плюс:

Вы можете использовать print() в тех местах, где вы не можете использовать print, например:

[print(x) for x in range(10)]
33 голосов
/ 05 июня 2011

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

2.x: print >> my_file, x
3.x: print(x, file=my_file)

Новая версия больше похожа на Python, не так ли?

Еще одним преимуществом версии функции является гибкость. Например, если вы хотите перехватить все print вызовы для целей отладки, теперь вы можете просто переопределить print:

def print(*args, **kwargs):
    # whatever
    __builtins__.print(*args, **kwargs)
18 голосов
/ 26 июня 2014

Я задумался над этим вопросом и понятия не имел о плюсах версии python 3. Но когда мне нужно было напечатать столбцы pandas.DataFrame (без Index([...])), я обнаружил, что

print *df.columns

выдает исключение, а

print(*df.columns)

отлично работает! И если вы хотите иметь одинаковые (настраиваемые) параметры печати при нескольких распечатках вызовов, вы можете сохранить их в словаре и передать как **print_options

Так что, по крайней мере, *args, **kw_args трюки являются хорошей причиной для print быть функцией!

11 голосов
/ 05 июня 2011

Вы можете заменить встроенный print на пользовательский:

import os
import sys

def print(s):
   sys.stderr.write('Will now print ' + str(s) + '.' + os.linesep)
   sys.stdout.write(str(s) + os.linesep)

print(['A', 'list'])
# Output: 
# stderr: Will now print ['A', 'list'].
# stdout: ['A', 'list']

Вы можете использовать print внутри лямбда-функции или вызова функции и т. Д.:

example_timeout_function(call=lambda: print('Hello world'), timeout=5)
do_things(print_function=print)
...