Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python Enhancement Proposals

PEP 3105 – Make print a function

Author:
Georg Brandl <georg at Python.org>
Status:
Final
Type:
Standards Track
Created:
19-Nov-2006
Python-Version:
3.0
Post-History:


Table of Contents

Abstract

The title says it all – this PEP proposes a newprint()builtin that replaces theprintstatement and suggests a specific signature for the new function.

Rationale

Theprintstatement has long appeared on lists of dubious language features that are to be removed in Python 3000, such as Guido’s “Python Regrets” presentation[1].As such, the objective of this PEP is not new, though it might become much disputed among Python developers.

The following arguments for aprint()function are distilled from a Python -3000 message by Guido himself[2]:

  • printis the only application-level functionality that has a statement dedicated to it. Within Python’s world, syntax is generally used as a last resort, when somethingcan’tbe done without help from the compiler. Print doesn’t qualify for such an exception.
  • At some point in application development one quite often feels the need to replaceprintoutput by something more sophisticated, like logging calls or calls into some other I/O library. With aprint() function, this is a straightforward string replacement, today it is a mess adding all those parentheses and possibly converting>>stream style syntax.
  • Having special syntax forprintputs up a much larger barrier for evolution, e.g. a hypothetical newprintf()function is not too far fetched when it will coexist with aprint()function.
  • There’s no easy way to convertprintstatements into another call if one needs a different separator, not spaces, or none at all. Also, there’s no easy wayat allto conveniently print objects with some other separator than a space.
  • Ifprint()is a function, it would be much easier to replace it within one module (justdefprint(*args):...) or even throughout a program (e.g. by putting a different function in__builtin__.print). As it is, one can do this by writing a class with awrite()method and assigning that tosys.stdout– that’s not bad, but definitely a much larger conceptual leap, and it works at a different level than print.

Specification

The signature forprint(),taken from various mailings and recently posted on the Python -3000 list[3]is:

defprint(*args,sep=' ',end='\n',file=None)

A call like:

print(a,b,c,file=sys.stderr)

will be equivalent to today’s:

print>>sys.stderr,a,b,c

while the optionalsepandendarguments specify what is printed between and after the arguments, respectively.

Thesoftspacefeature (a semi-secret attribute on files currently used to tell print whether to insert a space before the first item) will be removed. Therefore, there will not be a direct translation for today’s:

print"a",
print

which will not print a space between the"a"and the newline.

Backwards Compatibility

The changes proposed in this PEP will render most of today’sprint statements invalid. Only those which incidentally feature parentheses around all of their arguments will continue to be valid Python syntax in version 3.0, and of those, only the ones printing a single parenthesized value will continue to do the same thing. For example, in 2.x:

>>>print("Hello")
Hello
>>>print("Hello","world")
('Hello', 'world')

whereas in 3.0:

>>>print("Hello")
Hello
>>>print("Hello","world")
Hello world

Luckily, as it is a statement in Python 2,printcan be detected and replaced reliably and non-ambiguously by an automated tool, so there should be no major porting problems (provided someone writes the mentioned tool).

Implementation

The proposed changes were implemented in the Python 3000 branch in the Subversion revisions 53685 to 53704. Most of the legacy code in the library has been converted too, but it is an ongoing effort to catch every print statement that may be left in the distribution.

References


Source:https://github / Python /peps/blob/main/peps/pep-3105.rst

Last modified:2023-09-09 17:39:29 GMT