[Python-3000] Pre-PEP: Simple input built-in in Python 3000 (original) (raw)
Guido van Rossum guido at python.org
Fri Dec 22 22:47:35 CET 2006
- Previous message: [Python-3000] Pre-PEP: Simple input built-in in Python 3000
- Next message: [Python-3000] Pre-PEP: Simple input built-in in Python 3000
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
I like the exact proposal made here better than any of the alternatives mentioned so far.
Against naming it readline(): the "real" readline doesn't strip the \n and returns an empty string for EOF instead of raising EOFError; I believe the latter is more helpful for true beginners' code.
Against naming it ask() and renaming print() to say(): I find those rather silly names that belong in toy or AI languages. Changing print from statement to function maintains Pythonicity; renaming it say() does not.
I don't expect there will be much potential confusion with the 2.x input(); that function is used extremely rarely. It will be trivial to add rules to the refactoring tool (sandbox/2to3/) that replace input() with eval(input()) and replace raw_input() with input().
--Guido
On 12/22/06, Andre Roberge <andre.roberge at gmail.com> wrote:
A few months ago, there was an active discussion on edu-sig regarding the proposed fate of rawinput(). The text below is an attempt at summarizing the discussion in the form of a tentative PEP. It is respectfully submitted for your consideration.
If it is to be considered, in some form, as an official PEP, I have absolutely no objection for a regular python-dev contributor to take over the ownership/authorship. André Roberge ----------------------------------------------------------------- PEP: XXX Title: Simple input built-in in Python 3000 Version: Revision:0.2Revision: 0.2 Revision:0.2 Last-Modified: Date:2006/12/2210:00:00Date: 2006/12/22 10:00:00 Date:2006/12/2210:00:00 Author: André Roberge <andre.roberge at gmail.com > Status: Draft Type: Standards Track Content-Type: text/x-rst Created: 13-Sep-2006 Python-Version: 3.0 Post-History: Abstract ======== Input and output are core features of computer programs. Currently, Python provides a simple means of output through the print keyword and two simple means of interactive input through the input() and rawinput() built-in functions. Python 3.0 will introduces various incompatible changes with previous Python versions[1]. Among the proposed changes, print will become a built-in function, print(), while input() and rawinput() would be removed completely from the built-in namespace, requiring importing some module to provide even the most basic input capability. This PEP proposes that Python 3.0 retains some simple interactive user input capability, equivalent to rawinput(), within the built-in namespace. Motivation ========== With its easy readability and its support for many programming styles (e.g. procedural, object-oriented, etc.) among others, Python is perhaps the best computer language to use in introductory programming classes. Simple programs often need to provide information to the user (output) and to obtain information from the user (interactive input). Any computer language intended to be used in an educational setting should provide straightforward methods for both output and interactive input. The current proposals for Python 3.0 [1] include a simple output pathway via a built-in function named print(), but a more complicated method for input [e.g. via sys.stdin.readline()], one that requires importing an external module. Current versions of Python (pre-3.0) include rawinput() as a built-in function. With the availability of such a function, programs that require simple input/output can be written from day one, without requiring discussions of importing modules, streams, etc. Rationale ========= Current built-in functions, like input() and rawinput(), are found to be extremely useful in traditional teaching settings. (For more details, see [2] and the discussion that followed.) While the BDFL has clearly stated [3] that input() was not to be kept in Python 3000, he has also stated that he was not against revising the decision of killing rawinput(). rawinput() provides a simple mean to ask a question and obtain a response from a user. The proposed plans for Python 3.0 would require the replacement of the single statement name = rawinput("What is your name?") by the more complicated import sys print("What is your name?") same = sys.stdin.readline() However, from the point of view of many Python beginners and educators, the use of sys.stdin.readline() presents the following problems: 1. Compared to the name "rawinput", the name "sys.stdin.readline()" is clunky and inelegant. 2. The names "sys" and "stdin" have no meaning for most beginners, who are mainly interested in what the function does, and not where in the package structure it is located. The lack of meaning also makes it difficult to remember: is it "sys.stdin.readline()", or " stdin.sys.readline()"? To a programming novice, there is not any obvious reason to prefer one over the other. In contrast, functions simple and direct names like print, input, and rawinput, and open are easier to remember. 3. The use of "." notation is unmotivated and confusing to many beginners. For example, it may lead some beginners to think "." is a standard character that could be used in any identifier. 4. There is an asymmetry with the print function: why is print not called sys.stdout.print()?
Specification ============= The built-in input function should be totally equivalent to the existing rawinput() function. Open issues =========== With input() effectively removed from the language, the name rawinput() makes much less sense and alternatives should be considered. The various possibilities mentioned in various forums include: ask() askuser() getstring() input() # rejected by BDFL prompt() read() userinput() getresponse() While it has bee rejected by the BDFL, it has been suggested that the most direct solution would be to rename "rawinput" to "input" in Python 3000. The main objection is that Python 2.x already has a function named "input", and, even though it is not going to be included in Python 3000, having a built-in function with the same name but different semantics may confuse programmers migrating from 2.x to 3000. Certainly, this is no problem for beginners, and the scope of the problem is unclear for more experienced programmers, since rawinput(), while popular with many, is not in universal use. In this instance, the good it does for beginners could be seen to outweigh the harm it does to experienced programmers - although it could cause confusion for people reading older books or tutorials. References ========== .. [1] PEP 3100, Miscellaneous Python 3.0 Plans, Kuchling, Cannon (http://www.python.org/dev/peps/pep-3100/) .. [2] The fate of rawinput() in Python 3000 (http://mail.python.org/pipermail/edu-sig/2006-September/006967.html) .. [3] Educational aspects of Python 3000 ( http://mail.python.org/pipermail/python-3000/2006-September/003589.html) Copyright ========= This document has been placed in the public domain.
Python-3000 mailing list Python-3000 at python.org http://mail.python.org/mailman/listinfo/python-3000 Unsubscribe: http://mail.python.org/mailman/options/python-3000/guido%40python.org
-- --Guido van Rossum (home page: http://www.python.org/~guido/)
- Previous message: [Python-3000] Pre-PEP: Simple input built-in in Python 3000
- Next message: [Python-3000] Pre-PEP: Simple input built-in in Python 3000
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]