Subject: FAQ: Python -- an object-oriented language
Newsgroups: comp.lang.python,comp.answers,news.answers
Followup-to: comp.lang.python
From: guido@cnri.reston.va.us (Guido van Rossum)
Reply-to: guido@cnri.reston.va.us (Guido van Rossum)
Expires: Sun, 1 Dec 1996 00:00:00 GMT
Supersedes: <DxJ3t1.CJv@cwi.nl>
Approved: news-answers-request@MIT.Edu

Archive-name: python-faq/part1
Submitted-by: Guido van Rossum <guido@cnri.reston.va.us>
Version: $Revision$
Last-modified: $Date$

This article contains answers to Frequently Asked Questions about
Python (an object-oriented interpreted programming language -- see
the answer to question 1.1 for a short overview).

Copyright 1993-1996 Guido van Rossum.  Unchanged electronic
redistribution of this FAQ is allowed.  Printed redistribution only
with permission of the author.  No warranties.

Author's address:
        Guido van Rossum
        C.N.R.I.
        1895 Preston White Drive
        Reston, VA 20191
        U.S.A.
Email:  <guido@python.org>, <guido@cnri.reston.va.us>

The latest version of this FAQ is available by anonymous ftp from
<URL:ftp://ftp.python.org/pub/python/doc/FAQ>.  It will also be posted
regularly to the newsgroups comp.answers <URL:news:comp.answers> and
comp.lang.python <URL:news:comp.lang.python>.

Many FAQs, including this one, are available by anonymous ftp
<URL:ftp://rtfm.mit.edu/pub/usenet/news.answers/>.  The name under
which a FAQ is archived appears in the Archive-name line at the top of
the article.  This FAQ is archived as python-faq/part1
<URL:ftp://rtfm.mit.edu/pub/usenet/news.answers/python-faq/part1>.

There's a mail server on that machine which will send you files from
the archive by e-mail if you have no ftp access.  You send a e-mail
message to <mail-server@rtfm.mit.edu> containing the single word help
in the message body to receive instructions.

This FAQ is divided in the following chapters:

 1. General information and availability
 2. Python in the real world
 3. Building Python and Other Known Bugs
 4. Programming in Python
 5. Extending Python
 6. Python's design
 7. Using Python on non-UNIX platforms

To find the start of a particular chapter, search for the chapter number
followed by a dot and a space at the beginning of a line (e.g. to
find chapter 4 in vi, type /^4\. /).

Here's an overview of the questions per chapter:

 1. General information and availability
  1.1. Q. What is Python?
  1.2. Q. Why is it called Python?
  1.3. Q. How do I obtain a copy of the Python source?
  1.4. Q. How do I get documentation on Python?
  1.5. Q. Are there other ftp sites that mirror the Python distribution?
  1.6. Q. Is there a newsgroup or mailing list devoted to Python?
  1.7. Q. Is there a WWW page devoted to Python?
  1.8. Q. Is the Python documentation available on the WWW?
  1.9. Q. Is there a book on Python, or will there be one out soon?
  1.10. Q. Are there any published articles about Python that I can quote?
  1.11. Q. Are there short introductory papers or talks on Python?
  1.12. Q. How does the Python version numbering scheme work?
  1.13. Q. How do I get a beta test version of Python?
  1.14. Q. Are there copyright restrictions on the use of Python?
  1.15. Q. Why was Python created in the first place?

 2. Python in the real world
  2.1. Q. How many people are using Python?
  2.2. Q. Have any significant projects been done in Python?
  2.3. Q. Are there any commercial projects going on using Python?
  2.4. Q. How stable is Python?
  2.5. Q. What new developments are expected for Python in the future?
  2.6. Q. Is it reasonable to propose incompatible changes to Python?
  2.7. Q. What is the future of Python?
  2.8. Q. What is the PSA, anyway?
  2.9. Q. How do I join the PSA?
  2.10. Q. What are the benefits of joining the PSA?

 3. Building Python and Other Known Bugs
  3.1. Q. Is there a test set?
  3.2. Q. When running the test set, I get complaints about floating point
       operations, but when playing with floating point operations I cannot
       find anything wrong with them.
  3.3. Q. Link errors after rerunning the configure script.
  3.4. Q. The python interpreter complains about options passed to a
       script (after the script name).
  3.5. Q. When building on the SGI, make tries to run python to create
       glmodule.c, but python hasn't been built or installed yet.
  3.6. Q. I use VPATH but some targets are built in the source directory.
  3.7. Q. Trouble building or linking with the GNU readline library.
  3.8. Q. Trouble with socket I/O on older Linux 1.x versions.
  3.9. Q. Trouble with prototypes on Ultrix.
  3.10. Q. Other trouble building Python on platform X.
  3.11. Q. How to configure dynamic loading on Linux.
  3.12. Q: I can't get shared modules to work on Linux 2.0 (Slackware96)?
  3.13. Q: Trouble when making modules shared on Linux.
  3.14. Q. How to use threads on Linux.
  3.15. Q. Errors when linking with a shared library containing C++ code.
  3.16. Q. I built with tkintermodule.c enabled but get "Tkinter not found".
  3.17. Q. I built with Tk 4.0 but Tkinter complains about the Tk version.
  3.18. Q. Link errors for Tcl/Tk symbols when linking with Tcl/Tk.
  3.19. Q. I configured and built Python for Tcl/Tk but "import Tkinter"
        fails.
  3.20. Q. Tk doesn't work right on DEC Alpha.
  3.21. Q. Several common system calls are missing from the posix module.
  3.22. Q. ImportError: No module named string, on MS Windows.
  3.23. Q. Core dump on SGI when using the gl module.

 4. Programming in Python
  4.1. Q. Is there a source code level debugger with breakpoints, step,
       etc.?
  4.2. Q. Can I create an object class with some methods implemented in
       C and others in Python (e.g. through inheritance)?  (Also phrased as:
       Can I use a built-in type as base class?)
  4.3. Q. Is there a curses/termcap package for Python?
  4.4. Q. Is there an equivalent to C's onexit() in Python?
  4.5. Q. When I define a function nested inside another function, the
       nested function seemingly can't access the local variables of the
       outer function.  What is going on?  How do I pass local data to a
       nested function?
  4.6. Q. How do I iterate over a sequence in reverse order?
  4.7. Q. My program is too slow.  How do I speed it up?
  4.8. Q. When I have imported a module, then edit it, and import it
       again (into the same Python process), the changes don't seem to take
       place.  What is going on?
  4.9. Q. How do I find the current module name?
  4.10. Q. I have a module in which I want to execute some extra code
        when it is run as a script.  How do I find out whether I am running as
        a script?
  4.11. Q. I try to run a program from the Demo directory but it fails
        with ImportError: No module named ...; what gives?
  4.12. Q. I have successfully built Python with STDWIN but it can't
        find some modules (e.g. stdwinevents).
  4.13. Q. What GUI toolkits exist for Python?
  4.14. Q. Are there any interfaces to database packages in Python?
  4.15. Q. Is it possible to write obfuscated one-liners in Python?
  4.16. Q. Is there an equivalent of C's "?:" ternary operator?
  4.17. Q. My class defines __del__ but it is not called when I delete the
        object.
  4.18. Q. How do I change the shell environment for programs called
        using os.popen() or os.system()?  Changing os.environ doesn't work.
  4.19. Q. What is a class?
  4.20. Q. What is a method?
  4.21. Q. What is self?
  4.22. Q. What is a unbound method?
  4.23. Q. How do I call a method defined in a base class from a derived
        class that overrides it?
  4.24. Q. How do I call a method from a base class without using the
        name of the base class?
  4.25. Q. How can I organize my code to make it easier to change the base
        class?
  4.26. Q. How can I find the methods or attributes of an object?
  4.27. Q. I can't seem to use os.read() on a pipe created with os.popen().
  4.28. Q. How can I create a stand-alone binary from a Python script?
  4.29. Q. What WWW tools are there for Python?
  4.30. Q. How do I run a subprocess with pipes connected to both input
        and output?
  4.31. Q. How do I call a function if I have the arguments in a tuple?
  4.32. Q. How do I enable font-lock-mode for Python in Emacs?
  4.33. Q. Is there an inverse to the format operator (a la C's scanf())?
  4.34. Q. Can I have Tk events handled while waiting for I/O?
  4.35. Q. How do I write a function with output parameters (call by reference)?
  4.36. Q. Please explain the rules for local and global variables in Python.
  4.37. Q. How can I have modules that mutually import each other?
  4.38. Q. How do I copy an object in Python?
  4.39. Q. How to implement persistent objects in Python?  (Persistent ==
        automatically saved to and restored from disk.)
  4.40. Q. I try to use __spam and I get an error about _SomeClassName__spam.
  4.41. Q. How do I delete a file?  And other file questions.

 5. Extending Python
  5.1. Q. Can I create my own functions in C?
  5.2. Q. Can I create my own functions in C++?
  5.3. Q. How can I execute arbitrary Python statements from C?
  5.4. Q. How can I evaluate an arbitrary Python expression from C?
  5.5. Q. How do I extract C values from a Python object?
  5.6. Q. How do I use mkvalue() to create a tuple of arbitrary length?
  5.7. Q. How do I call an object's method from C?
  5.8. Q. How do I catch the output from print_error()?
  5.9. Q. How do I access a module written in Python from C?
  5.10. Q. How do I interface to C++ objects from Python?

 6. Python's design
  6.1. Q. Why isn't there a switch or case statement in Python?
  6.2. Q. Why does Python use indentation for grouping of statements?
  6.3. Q. Why are Python strings immutable?
  6.4. Q. Why don't strings have methods like index() or sort(), like
       lists?
  6.5. Q. Why does Python use methods for some functionality
       (e.g. list.index()) but functions for other (e.g. len(list))?
  6.6. Q. Why can't I derive a class from built-in types (e.g. lists or
       files)?
  6.7. Q. Why must 'self' be declared and used explicitly in method
       definitions and calls?
  6.8. Q. Can't you emulate threads in the interpreter instead of
       relying on an OS-specific thread implementation?
  6.9. Q. Why can't lambda forms contain statements?
  6.10. Q. Why don't lambdas have access to variables defined in the
        containing scope?
  6.11. Q. Why can't recursive functions be defined inside other functions?
  6.12. Q. Why is there no more efficient way of iterating over a dictionary
        than first constructing the list of keys()?
  6.13. Q. Can Python be compiled to machine code, C or some other language?
  6.14. Q. Why doesn't Python use proper garbage collection?

 7. Using Python on non-UNIX platforms
  7.1. Q. Is there a Mac version of Python?
  7.2. Q. Are there DOS and Windows versions of Python?
  7.3. Q. Is there an OS/2 version of Python?
  7.4. Q. Is there a VMS version of Python?
  7.5. Q. What about IBM mainframes, or other non-UNIX platforms?
  7.6. Q. Where are the source or Makefiles for the non-UNIX versions?
  7.7. Q. What is the status and support for the non-UNIX versions?
  7.8. Q. I have a PC version but it appears to be only a binary.
       Where's the library?
  7.9. Q. Where's the documentation for the Mac or PC version?
  7.10. Q. The Mac (PC) version doesn't seem to have any facilities for
        creating or editing programs apart from entering it interactively, and
        there seems to be no way to save code that was entered interactively.
        How do I create a Python program on the Mac (PC)?

To find a particular question, search for the question number followed
by a dot, a space, and a Q at the beginning of a line (e.g. to find
question 4.2 in vi, type /^4\.2\. Q/).


1. General information and availability
 =======================================

1.1. Q. What is Python?

A. Python is an interpreted, interactive, object-oriented programming
language.  It incorporates modules, exceptions, dynamic typing, very
high level dynamic data types, and classes.  Python combines
remarkable power with very clear syntax.  It has interfaces to many
system calls and libraries, as well as to various window systems, and
is extensible in C or C++.  It is also usable as an extension language
for applications that need a programmable interface.  Finally, Python
is portable: it runs on many brands of UNIX, on the Mac, and on PCs
under MS-DOS, Windows, Windows NT, and OS/2.

To find out more, the best thing to do is to start reading the
tutorial from the documentation set (see a few questions further
down).

1.2. Q. Why is it called Python?

A. Apart from being a computer scientist, I'm also a fan of "Monty
Python's Flying Circus" (a BBC comedy series from the seventies, in
the -- unlikely -- case you didn't know).  It occurred to me one day
that I needed a name that was short, unique, and slightly mysterious.
And I happened to be reading some scripts from the series at the
time...  So then I decided to call my language Python.  But Python is
not a joke.  And don't you associate it with dangerous reptiles
either!  (If you need an icon, use an image of the 16-ton weight from
the TV series or of a can of SPAM :-)

1.3. Q. How do I obtain a copy of the Python source?

A. The latest complete Python source distribution is always available
by anonymous ftp, e.g.
<URL:ftp://ftp.python.org/pub/python/src/python1.3.tar.gz>.  It is a
gzipped tar file containing the complete C source, LaTeX
documentation, Python library modules, example programs, and several
useful pieces of freely distributable software.  This will compile and
run out of the box on most UNIX platforms.  (See section 7 for
non-UNIX information.)

Sometimes beta versions of a newer release are available; check the
subdirectory "beta" of the above-mentioned URL (i.e.
<URL:ftp://ftp.python.org/pub/python/src/beta/>).  (At the time of
writing, beta3 for Python 1.4 is available there, and should be
checked before reporting problems with version 1.3.)

Occasionally a set of patches is issued which has to be applied using
the patch program.  These patches are placed in the same directory,
e.g. <URL:ftp://ftp.python.org/pub/python/src/patch1.1.1>.  (At the time
of writing, no patches exist.)

An index of said ftp directory can be found in the file INDEX.  An
HTML version of the index can be found in the file index.html,
<URL:ftp://ftp.python.org/pub/python/index.html>.

1.4. Q. How do I get documentation on Python?

A. The LaTeX source for the documentation is part of the source
distribution.  If you don't have LaTeX, the latest Python
documentation set is always available by anonymous ftp, e.g.
<URL:ftp://ftp.python.org/pub/python/doc/postscript.tar.gz>.  It is a
gzipped tar file containing PostScript files of the reference manual,
the library manual, and the tutorial.  Note that the library manual is
the most important one of the set, as much of Python's power stems
from the standard or built-in types, functions and modules, all of
which are described here.  PostScript for a high-level description of
Python is in the file nluug-paper.ps (a separate file on the ftp
site).

1.5. Q. Are there other ftp sites that mirror the Python distribution?

A. The following anonymous ftp sites keep mirrors of the Python
distribution:

USA:

        <URL:ftp://ftp.python.org/pub/python/>
        <URL:ftp://gatekeeper.dec.com/pub/plan/python/>
        <URL:ftp://ftp.uu.net/languages/python/>
        <URL:ftp://ftp.wustl.edu/graphics/graphics/sgi-stuff/python/>
        <URL:ftp://ftp.sterling.com/programming/languages/python/>
        <URL:ftp://uiarchive.cso.uiuc.edu/pub/lang/python/>
        <URL:ftp://ftp.pht.com/mirrors/python/python/>

Europe:

        <URL:ftp://ftp.cwi.nl/pub/python/>
        <URL:ftp://ftp.funet.fi/pub/languages/python/>
        <URL:ftp://ftp.sunet.se/pub/lang/python/>
        <URL:ftp://unix.hensa.ac.uk/mirrors/uunet/languages/python/>
        <URL:ftp://ftp.ibp.fr/pub/python/>
        <URL:ftp://sunsite.cnlab-switch.ch/mirror/python/>
        <URL:ftp://ftp.informatik.tu-muenchen.de/pub/comp/programming/languages/python/>

Australia:

        <URL:ftp://ftp.dstc.edu.au/pub/python/>

Or try archie on the string "python".

1.6. Q. Is there a newsgroup or mailing list devoted to Python?

A. There is a newsgroup, comp.lang.python <URL:news:comp.lang.python>,
and a mailing list.  The newsgroup and mailing list are gatewayed into
each other -- if you can read news it's unnecessary to subscribe to
the mailing list.  Send e-mail to <python-list-request@cwi.nl> to
(un)subscribe to the mailing list.  Hypermail archives of (nearly)
everything posted to the mailing list (and thus the newsgroup) are
available on our WWW server,
<URL:http://www.cwi.nl/~guido/hypermail/index.html>.  The raw archives
are also available by ftp, e.g.
<URL:ftp://ftp.python.org/pub/python/mail/mailinglist.gz>.  The
uncompressed versions of these files can be read with the standard
UNIX Mail program ("Mail -f file") or with nn ("nn file").  To read
them using MH, you could use "inc -file file".  (The archival service
has stopped archiving new articles around the end of April 1995.  I
hope to revive it on the PSA server www.python.org sometime in the
future.)

1.7. Q. Is there a WWW page devoted to Python?

A. Yes, <URL:http://www.python.org/> is the official Python home page.
At the time of writing, this page is not yet completely operational;
you may have a look at the old Python home page:
<URL:http://www.cwi.nl/~guido/Python.html> or at the U.S. copy:
<URL:http://www.python.org/~guido/Python.html>.

1.8. Q. Is the Python documentation available on the WWW?

A. Yes, see <URL:http://www.python.org/> (Python's home page).  It
contains pointers to hypertext versions of the whole documentation set
(as hypertext, not just PostScript).

If you wish to browse this collection of HTML files on your own
machine, it is available bundled up by anonymous ftp,
e.g. <URL:ftp://ftp.python.org/pub/python/doc/html.tar.gz>.

An Emacs-INFO set containing the library manual is also available by
ftp, e.g. <URL:ftp://ftp.python.org/pub/python/doc/lib-info.tar.gz>.

1.9. Q. Is there a book on Python, or will there be one out soon?

A. Mark Lutz is writing a Python book for O'Reilly and Associates, to
be published early 1996.  See the outline (in PostScript):
<URL:http://www.python.org/workshops/1995-05/outlinep.eps>.

1.10. Q. Are there any published articles about Python that I can quote?

A. So far the only refereed and published article that describes
Python in some detail is:

    Guido van Rossum and Jelke de Boer, "Interactively Testing Remote
    Servers Using the Python Programming Language", CWI Quarterly, Volume
    4, Issue 4 (December 1991), Amsterdam, pp 283-303.

LaTeX source for this paper is available as part of the Python source
distribution.

See also the next section (supposedly Aaron Watters' paper has been
refereed).

1.11. Q. Are there short introductory papers or talks on Python?

A. A recent, very entertaining introduction to Python is the tutorial by
Aaron Watters in UnixWorld Online:

    Aaron R. Watters: "The What, Why, Who, and Where of Python",
    <URL:http://www.wcmh.com/uworld/archives/95/tutorial/005.html>

An olded paper is:

    Guido van Rossum, "An Introduction to Python for UNIX/C
    Programmers", in the proceedings of the NLUUG najaarsconferentie
    1993 (dutch UNIX users group meeting November 1993).

PostScript for this paper and for the slides used for the accompanying
presentation is available by ftp as
<URL:ftp://ftp.python.org/pub/python/doc/nluug-paper.ps> and
<URL:ftp://ftp.python.org/pub/python/doc/nluug-slides.ps>, respectively.

Slides for a talk on Python that I gave at the Usenix Symposium on
Very High Level Languages in Santa Fe, NM, USA in October 1994 are
available as <URL:ftp://ftp.python.org/pub/python/doc/vhll-slides.ps>.

1.12. Q. How does the Python version numbering scheme work?

A. Python versions are numbered A.B.C or A.B.  A is the major version
number -- it is only incremented for major changes in functionality or
source structure.  B is the minor version number, incremented for less
earth-shattering changes to a release.  C is the patchlevel -- it is
incremented for each new patch release.  Not all releases have patch
releases.  Note that in the past, patches have added significant
changes; in fact the changeover from 0.9.9 to 1.0.0 was the first time
that either A or B changed!

Beta versions have an additional suffix of "betaN" for some small
number N.  Note that (for instance) all versions labeled 1.4betaN
*precede* the actual release of 1.4.  1.4b3 is short for 1.4beta3.

1.13. Q. How do I get a beta test version of Python?

A. If there are any beta releases, they are published in the normal
source directory (e.g. <URL:ftp://ftp.python.org/pub/python/src/>).

1.14. Q. Are there copyright restrictions on the use of Python?

A. Hardly.  You can do anything you want with the source, as long as
you leave the copyrights in, and display those copyrights in any
documentation about Python that you produce.  Also, don't use the
author's institute's name in publicity without prior written
permission, and don't hold them responsible for anything (read the
actual copyright for a precise legal wording).

In particular, if you honor the copyright rules, it's OK to use Python
for commercial use, to sell copies of Python in source or binary form,
or to sell products that enhance Python or incorporate Python (or part
of it) in some form.  I would still like to know about all commercial
use of Python!

1.15. Q. Why was Python created in the first place?

A. Here's a *very* brief summary of what got me started:

- I had extensive experience with implementing an interpreted language
in the ABC group at CWI, and from working with this group I had
learned a lot about language design.  This is the origin of many
Python features, including the use of indentation for statement
grouping and the inclusion of very-high-level data types (although the
details are all different in Python).

- I had a number of gripes about the ABC language, but also liked many
of its features.  It was impossible to extend the ABC language (or its
implementation) to remedy my complaints -- in fact its lack of
extensibility was one of its biggest problems.

- I had some experience with using Modula-2+ and talked with the
designers of Modula-3 (and read the M3 report).  M3 is the origin of
the syntax and semantics used for exceptions, and some other Python
features.

- I was working in the Amoeba distributed operating system group at
CWI.  We needed a better way to do system administration than by
writing either C programs or Bourne shell scripts, since Amoeba had
its own system call interface which wasn't easily accessible from the
Bourne shell.  My experience with error handling in Amoeba made me
acutely aware of the importance of exceptions as a programming
language feature.

- It occurred to me that a scripting language with a syntax like ABC
but with access to the Amoeba system calls would fill the need.  I
realized that it would be foolish to write an Amoeba-specific
language, so I decided that I needed a language that was generally
extensible.

- During the 1989 Christmas holidays, I had a lot of time on my hand,
so I decided to give it a try.  During the next year, while still
mostly working on it in my own time, Python was used in the Amoeba
project with increasing success, and the feedback from colleagues made
me add many early improvements.

- In February 1991, after just over a year of development, I decided
to post to USENET.  The rest is in the Misc/HISTORY file.


2. Python in the real world
===========================

2.1. Q. How many people are using Python?

A. I don't know, but the maximum number of simultaneous subscriptions
to the Python mailing list before it was gatewayed into the newsgroup
was about 180 (several of which were local redistribution lists).  I
believe that many active Python users don't bother to subscribe to the
list, and now that there's a newsgroup the mailing list subscription
is even less meaningful.  I see new names on the newsgroup all the
time and my best guess is that there are currently at least several
thousands of users.

Another statistic is the number of accesses to the Python WWW server.
Have a look at <URL:http://www.python.org/stats/>.

2.2. Q. Have any significant projects been done in Python?

A. Here at CWI (the home of Python), we have written a 20,000 line
authoring environment for transportable hypermedia presentations, a
5,000 line multimedia teleconferencing tool, as well as many many
smaller programs.

The University of Virginia uses Python to control a virtual reality
engine.  Contact: Matt Conway <conway@virginia.edu>.

The ILU project at Xerox PARC can generate Python glue for ILU
interfaces.  See <URL:ftp://ftp.parc.xerox.com/pub/ilu/ilu.html>.

The University of California, Irvine uses a student administration
system called TELE-Vision written entirely in Python.  Contact: Ray
Price <rlprice@uci.edu>.

See also the next question.

If you have done a significant project in Python that you'd like to be
included in the list above, send me email!

2.3. Q. Are there any commercial projects going on using Python?

A. Several companies have revealed to me that they are planning or
considering use of Python in a future product.

Sunrise Software has a product out using Python -- they use Python
for a GUI management application and an SNMP network management
application.  Contact: <info@sunrise.com>.

Infoseek uses Python to implement their commercial WWW information
retrieval service <URL:http://www.infoseek.com/>.  Contact:
<info@infoseek.com>.

Paul Everitt of Connecting Minds is planning a Lotus Notes gateway.
Contact: <Paul.Everitt@cminds.com>.  Or see their WWW server
<URL:http://www.cminds.com/>.

KaPRE in Boulder, CO is using Python for on-site customization of C++
applications, rapid-prototyping/development,
language-based-components, and possibly more.  This is pretty solid:
Python's being shipped with their tool-set now, to beta sites.
Contact: <lutz@KaPRE.COM> (Mark Lutz).

Individuals at many other companies are using Python for internal
development or for as yet unannounced products (witness their
contributions to the Python mailing list or newsgroup).

SGI has advertised in the Python list looking for Python programmers
for a project involving interactive television.

See also the workshop minutes at
<URL:http://www.python.org/workshops/> -- in general the WWW server is
more up to date than the FAQ for these issues.

Python has also been elected as an extension language by MADE, a
consortium supported by the European Committee's ESPRIT program and
consisting of Bull, CWI and some other European companies.  Contact:
Ivan Herman <ivan@cwi.nl>.

If you'd like to be included in the list above, send me email!

2.4. Q. How stable is Python?

A. Very stable.  While the current version number would suggest it is
in the early stages of development, in fact new, stable releases
(numbered 0.9.x through 1.4) have been coming out roughly every 3 to
6 or 12 months for the past four years.

2.5. Q. What new developments are expected for Python in the future?

A. Follow the newsgroup discussions!  The workshop proceedings
(<URL:http://www.python.org/workshops/>) may also contain interesting
looks into the future.

2.6. Q. Is it reasonable to propose incompatible changes to Python?

A. In general, no.  There are already millions of lines of Python code
around the world, so any changes in the language that invalidates more
than a very small fraction of existing programs has to be frowned
upon.  Even if you can provide a conversion program, there still is
the problem of updating all documentation.  Providing a gradual
upgrade path is the only way if a feature has to be changed.

2.7. Q. What is the future of Python?

A. If I knew, I'd be rich :-)

Seriously, the formation of the PSA (Pyton Software Activity, see
<URL:http://www.python.org/psa/>) ensures some kind of support even in
the (unlikely! event that I'd be hit by a bus (actually, here in the
US, a car accident would be more likely :-), were to join a nunnery,
or would be head-hunted.  A large number of Python users have become
experts at Python programming as well as maintenance of the
implementation, and would easily fill the vacuum created by my
disappearance.

In the mean time, I have no plans to disappear -- rather, I am
committed to improving Python, and my current benefactor, CNRI (see
<URL:http://www.cnri.reston.va.us>) is just as committed to continue
its support of Python and the PSA.  In fact, we have great plans for
Python -- we just can't tell yet!

2.8. Q. What is the PSA, anyway?

A. The Python Software Activity <URL:http://www.python.org/psa/> was
created by a number of Python aficionados who want Python to be more
than the product and responsibility of a single individual.  It has
found a home at CNRI <URL:http://www.cnri.reston.va.us>.  Anybody who
wishes Python well should join the PSA.

2.9. Q. How do I join the PSA?

A. The full scoop is available on the web, see
<URL:http://www.python.org/psa/Joining.html>.  Summary: send a check
of at least $50 to CNRI/PSA, 1895 Preston White Drive, Suite 100, in
Reston, VA 20191.  Full-time students pay $25.  Companies can join for
a mere $500.

2.10. Q. What are the benefits of joining the PSA?

A. Like National Public Radio, if not enough people join, Python will
wither.  Your name will be mentioned on the PSA's web server.
Workshops organized by the PSA <URL:http://www.python.org/workshops/>
are only accessible to PSA members (you can join at the door).  The
PSA is working on additional benefits, such as reduced prices for
books and software, and early access to beta versions of Python.


3. Building Python and Other Known Bugs
=======================================

3.1. Q. Is there a test set?

A. Yes, simply do "import testall" (or "import autotest" if you aren't
interested in the output).  The standard modules whose name begins
with "test" together comprise the test.  The test set doesn't test
*all* features of Python but it goes a long way to confirm that a new
port is actually working.  The Makefile contains an entry "make test"
which runs the autotest module.  NOTE: if "make test" fails, run the
tests manually ("import testall") to see what goes wrong before
reporting the error.

3.2. Q. When running the test set, I get complaints about floating point
operations, but when playing with floating point operations I cannot
find anything wrong with them.

A. The test set makes occasional unwarranted assumptions about the
semantics of C floating point operations.  Until someone donates a
better floating point test set, you will have to comment out the
offending floating point tests and execute similar tests manually.

3.3. Q. Link errors after rerunning the configure script.

A. It is generally necessary to run "make clean" after a configuration
change.

3.4. Q. The python interpreter complains about options passed to a
script (after the script name).

A. You are probably linking with GNU getopt, e.g. through -liberty.
Don't.  The reason for the complaint is that GNU getopt, unlike System
V getopt and other getopt implementations, doesn't consider a
non-option to be the end of the option list.  A quick (and compatible)
fix for scripts is to add "--" to the interpreter, like this:

        #! /usr/local/bin/python --

You can also use this interactively:

        python -- script.py [options]

Note that a working getopt implementation is provided in the Python
distribution (in Python/getopt.c) but not automatically used.

3.5. Q. When building on the SGI, make tries to run python to create
glmodule.c, but python hasn't been built or installed yet.

A. Comment out the line mentioning glmodule.c in Setup and build a
python without gl first; install it or make sure it is in your $PATH,
then edit the Setup file again to turn on the gl module, and make
again.  You don't need to do "make clean"; you do need to run "make
Makefile" in the Modules subdirectory (or just run "make" at the
toplevel).

3.6. Q. I use VPATH but some targets are built in the source directory.

A. On some systems (e.g. Sun), if the target already exists in the
source directory, it is created there instead of in the build
directory.  This is usually because you have previously built without
VPATH.  Try running "make clobber" in the source directory.

3.7. Q. Trouble building or linking with the GNU readline library.

A. Consider using readline 2.0.  Some hints:

- You can use the GNU readline library to improve the interactive user
interface: this gives you line editing and command history when
calling python interactively. You need to configure and build the GNU
readline library before running the configure script. Its sources are
no longer distributed with Python; you can ftp them from any GNU
mirror site, or from its home site
<URL:ftp://slc2.ins.cwru.edu/pub/dist/readline-2.0.tar.gz> (or a
higher version number -- using version 1.x is not recommended). Pass
the Python configure script the option --with-readline=DIRECTORY where
DIRECTORY is the absolute pathname of the directory where you've built
the readline library. Some hints on building and using the readline
library:

- On SGI IRIX 5, you may have to add the following
to rldefs.h:

        #ifndef sigmask
        #define sigmask(sig) (1L << ((sig)-1))
        #endif

- On most systems, you will have to add #include "rldefs.h" to the
top of several source files, and if you use the VPATH feature, you
will have to add dependencies of the form foo.o: foo.c to the
Makefile for several values of foo.

- The readline library requires use of the termcap library. A
known problem with this is that it contains entry points which
cause conflicts with the STDWIN and SGI GL libraries. The STDWIN
conflict can be solved (and will be, in the next release of
STDWIN) by adding a line saying '#define werase w_erase' to the
stdwin.h file (in the STDWIN distribution, subdirectory H). The
GL conflict has been solved in the Python configure script by a
hack that forces use of the static version of the termcap library.

- Check the newsgroup gnu.bash.bug <URL:news:gnu.bash.bug> for
specific problems with the readline library (I don't read this group
but I've been told that it is the place for readline bugs).

3.8. Q. Trouble with socket I/O on older Linux 1.x versions.

A. Once you've built Python, use it to run the regen.py script in the
Lib/linux1 directory.  Apparently the files as distributed don't match
the system headers on some Linux versions.

3.9. Q. Trouble with prototypes on Ultrix.

A. Ultrix cc seems broken -- use gcc, or edit config.h to #undef
HAVE_PROTOTYPES.

3.10. Q. Other trouble building Python on platform X.

A. Please email the details to <guido@cnri.reston.va.us> and I'll look
into it.  Please provide as many details as possible.  In particular,
if you don't tell me what type of computer and what operating system
(and version) you are using it will be difficult for me to figure out
what is the matter.  If you get a specific error message, please email
it to me too.

3.11. Q. How to configure dynamic loading on Linux.

A. This is now automatic as long as your Linux version uses the ELF
object format (all recent Linuxes do).

3.12. Q: I can't get shared modules to work on Linux 2.0 (Slackware96)?

A: This is a bug in the Slackware96 release.   The fix is simple:

Make sure that there is a link from /lib/libdl.so to /lib/libdl.so.1
so that the following links are setup:

	/lib/libdl.so -> /lib/libdl.so.1
	/lib/libdl.so.1 -> /lib/libdl.so.1.7.14

3.13. Q: Trouble when making modules shared on Linux.

A. This happens when you have built Python for static linking and then
enable *shared* in the Setup file.  Shared library code must be
compiled with "-fpic".  If a .o file for the module already exist that
was compiled for static linking, you must remove it or do "make clean"
in the Modules directory.

3.14. Q. How to use threads on Linux.

A. [Greg Stein] I built myself a libpthreads.so from the libc.5.3.12
distribution (the binary distribution doesn't have pthreads in
it).  Then, I configured Python with --with-threads and then tweaked
config.h to include a #define _MIT_POSIX_THREADS (or something like
that, see /usr/include/pthreads.h).  It worked fine at that point.

Note that I couldn't get threading to "operate well" with any of the
other thread packages.  Prior libc versions didn't integrate well with
threads, either, so I couldn't use them (e.g. sleep() blocked all
threads :-( ).

3.15. Q. Errors when linking with a shared library containing C++ code.

A. Link the main Python binary with C++.  Change the definition of
LINKCC in Modules/Makefile to be your C++ compiler.  You may have to
edit config.c slightly to make it compilable with C++.

3.16. Q. I built with tkintermodule.c enabled but get "Tkinter not found".

A. Tkinter.py (note: upper case T) lives in a subdirectory of Lib,
Lib/tkinter.  If you are using the default module search path, you
probably didn't enable the line in the Modules/Setup file defining
TKPATH; if you use the environment variable PYTHONPATH, you'll have to
add  the proper tkinter subdirectory.

3.17. Q. I built with Tk 4.0 but Tkinter complains about the Tk version.

A. Several things could cause this.  You most likely have a Tk 3.6
installation that wasn't completely eradicated by the Tk 4.0
installation (which tends to add "4.0" to its installed files).  You
may have the Tk 3.6 support library installed in the place where the
Tk 4.0 support files should be (default /usr/local/lib/tk/); you may
have compiled Python with the old tk.h header file (yes, this actually
compiles!); you may actually have linked with Tk 3.6 even though Tk
4.0 is also around.  Similar for Tcl 7.4 vs. Tcl 7.3.

3.18. Q. Link errors for Tcl/Tk symbols when linking with Tcl/Tk.

Quite possibly, there's a version mismatch between the Tcl/Tk header
files (tcl.h and tk.h) and the tck/tk libraries you are using (the
"-ltk4.0" and "-ltcl7.4" arguments for _tkinter in the Setup file).
If you have installed both versions 7.4/4.0 and 7.5/4.1 of Tcl/Tk,
most likely your header files are for The newer versions, but the
Setup line for _tkinter in some Python distributions references
7.4/4.0 by default.  Changing this to 7.5/4.1 should take care of
this.

3.19. Q. I configured and built Python for Tcl/Tk but "import Tkinter"
fails.

A. Most likely, you forgot to enable the line in Setup that says
"TKPATH=:$(DESTLIB)/tkinter".

3.20. Q. Tk doesn't work right on DEC Alpha.

A. You probably compiled either Tcl, Tk or Python with gcc.  Don't.
For this platform, which has 64-bit integers, gcc is known to generate
broken code.  The standard cc (which comes bundled with the OS!)
works.  If you still prefer gcc, at least try recompiling with cc
before reporting problems to the newsgroup or the author; if this
fixes the problem, report the bug to the gcc developers instead.  (As
far as we know, there are no problem with gcc on other platforms --
the instabilities seem to be restricted to the DEC Alpha.)  See also
question 3.6.

3.21. Q. Several common system calls are missing from the posix module.

A. Most likely, *all* test compilations run by the configure script
are failing for some reason or another.  Have a look in config.log to
see what could be the reason.  A common reason is specifying a
directory to the --with-readline option that doesn't contain the
libreadline.a file.

3.22. Q. ImportError: No module named string, on MS Windows.

A. Most likely, your PYTHONPATH environment variable should be set to
something like:

set PYTHONPATH=c:\python;c:\python\lib;c:\python\scripts

(assuming Python was installed in c:\python)

3.23. Q. Core dump on SGI when using the gl module.

There are conflicts between entry points in the termcap and curses
libraries and an entry point in the GL library.  There's a hack of a
fix for the termcap library if it's needed for the GNU readline
library, but it doesn't work when you're using curses.  Concluding,
you can't build a Python binary containing both the curses and gl
modules.



4. Programming in Python
========================

4.1. Q. Is there a source code level debugger with breakpoints, step,
etc.?

A. Yes.  Check out module pdb; pdb.help() prints the documentation (or
you can read it as Lib/pdb.doc).  If you use the STDWIN option,
there's also a windowing interface, wdb.  You can write your own
debugger by using the code for pdb or wdb as an example.

4.2. Q. Can I create an object class with some methods implemented in
C and others in Python (e.g. through inheritance)?  (Also phrased as:
Can I use a built-in type as base class?)

A. No, but you can easily create a Python class which serves as a
wrapper around a built-in object, e.g. (for dictionaries):

        # A user-defined class behaving almost identical
        # to a built-in dictionary.
        class UserDict:
                def __init__(self): self.data = {}
                def __repr__(self): return repr(self.data)
                def __cmp__(self, dict):
                        if type(dict) == type(self.data):
                                return cmp(self.data, dict)
                        else:
                                return cmp(self.data, dict.data)
                def __len__(self): return len(self.data)
                def __getitem__(self, key): return self.data[key]
                def __setitem__(self, key, item): self.data[key] = item
                def __delitem__(self, key): del self.data[key]
                def keys(self): return self.data.keys()
                def items(self): return self.data.items()
                def values(self): return self.data.values()
                def has_key(self, key): return self.data.has_key(key)

4.3. Q. Is there a curses/termcap package for Python?

A. Yes -- Lance Ellinghaus has written a module that interfaces to
System V's "ncurses".  If you know a little curses and some Python,
it's straightforward to use.  It is part of the standard Python
distribution, but not configured by default -- you must enable it by
editing Modules/Setup.  It requires a System V curses implementation.

You could also consider using the "alfa" (== character cell) version
of STDWIN.  (Standard Window System Interface, a portable windowing
system interface by myself <URL:ftp://ftp.cwi.nl/pub/stdwin/>.)  This
will also prepare your program for porting to windowing environments
such as X11 or the Macintosh.

4.4. Q. Is there an equivalent to C's onexit() in Python?

A. Yes, if you import sys and assign a function to sys.exitfunc, it
will be called when your program exits, is killed by an unhandled
exception, or (on UNIX) receives a SIGHUP or SIGTERM signal.

4.5. Q. When I define a function nested inside another function, the
nested function seemingly can't access the local variables of the
outer function.  What is going on?  How do I pass local data to a
nested function?

A. Python does not have arbitrarily nested scopes.  When you need to
create a function that needs to access some data which you have
available locally, create a new class to hold the data and return a
method of an instance of that class, e.g.:

        class MultiplierClass:
            def __init__(self, factor):
                self.factor = factor
            def multiplier(self, argument):
                return argument * self.factor

        def generate_multiplier(factor):
            return MultiplierClass(factor).multiplier

        twice = generate_multiplier(2)
        print twice(10)
        # Output: 20

An alternative solution uses default arguments, e.g.:

        def generate_multiplier(factor):
            def multiplier(arg, fact = factor):
                return arg*fact
            return multiplier

        twice = generate_multiplier(2)
        print twice(10)
        # Output: 20

4.6. Q. How do I iterate over a sequence in reverse order?

A. If it is a list, the fastest solution is

        list.reverse()
        try:
                for x in list:
                        "do something with x"
        finally:
                list.reverse()

This has the disadvantage that while you are in the loop, the list
is temporarily reversed.  If you don't like this, you can make a copy.
This appears expensive but is actually faster than other solutions:

        rev = list[:]
        rev.reverse()
        for x in rev:
                <do something with x>

If it isn't a list, a more general but slower solution is:

        i = len(list)
        while i > 0:
                i = i-1
                x = list[i]
                <do something with x>

A more elegant solution, is to define a class which acts as a sequence
and yields the elements in reverse order (solution due to Steve
Majewski):

        class Rev:
                def __init__(self, seq):
                        self.forw = seq
                def __len__(self):
                        return len(self.forw)
                def __getitem__(self, i):
                        return self.forw[-(i + 1)]

You can now simply write:

        for x in Rev(list):
                <do something with x>

Unfortunately, this solution is slowest of all, due to the method
call overhead...

4.7. Q. My program is too slow.  How do I speed it up?

A. That's a tough one, in general.  There are many tricks to speed up
Python code; I would consider rewriting parts in C only as a last
resort.  One thing to notice is that function and (especially) method
calls are rather expensive; if you have designed a purely OO interface
with lots of tiny functions that don't do much more than get or set an
instance variable or call another method, you may consider using a
more direct way, e.g. directly accessing instance variables.  Also see
the standard module "profile" (described in the file
"python/lib/profile.doc") which makes it possible to find out where
your program is spending most of its time (if you have some patience
-- the profiling itself can slow your program down by an order of
magnitude).

4.8. Q. When I have imported a module, then edit it, and import it
again (into the same Python process), the changes don't seem to take
place.  What is going on?

A. For reasons of efficiency as well as consistency, Python only reads
the module file on the first time a module is imported.  (Otherwise a
program consisting of many modules, each of which imports the same
basic module, would read the basic module over and over again.)  To
force rereading of a changed module, do this:

        import modname
        reload(modname)

Warning: this technique is not 100% fool-proof.  In particular,
modules containing statements like

        from modname import some_objects

will continue to work with the old version of the imported objects.

4.9. Q. How do I find the current module name?

A. A module can find out its own module name by looking at the
(predefined) global variable __name__.  If this has the value
'__main__' you are running as a script.  

4.10. Q. I have a module in which I want to execute some extra code
when it is run as a script.  How do I find out whether I am running as
a script?

A. See the previous question.  E.g. if you put the following on the
last line of your module, main() is called only when your module is
running as a script:

        if __name__ == '__main__': main()

4.11. Q. I try to run a program from the Demo directory but it fails
with ImportError: No module named ...; what gives?

A. This is probably an optional module (written in C!) which hasn't
been configured on your system.  This especially happens with modules
like "Tkinter", "stdwin", "gl", "Xt" or "Xm".  For Tkinter, STDWIN and
many other modules, see Modules/Setup.in for info on how to add these
modules to your Python, if it is possible at all.  Sometimes you will
have to ftp and build another package first (e.g. STDWIN).  Sometimes
the module only works on specific platforms (e.g. gl only works on SGI
machines).

NOTE: if the complaint is about "Tkinter" (upper case T) and you have
already configured module "tkinter" (lower case t), the solution is
*not* to rename tkinter to Tkinter or vice versa.  There is probably
something wrong with your module search path.  Check out the value of
sys.path.

For X-related modules (Xt and Xm) you will have to do more work: they
are currently not part of the standard Python distribution.  You will
have to ftp the Extensions tar file, e.g.
<URL:ftp://ftp.python.org/pub/python/src/extensions.tar.gz> and follow
the instructions there.

See also the next question.

4.12. Q. I have successfully built Python with STDWIN but it can't
find some modules (e.g. stdwinevents).

A. There's a subdirectory of the library directory named 'stdwin'
which should be in the default module search path.  There's a line in
Modules/Setup(.in) that you have to enable for this purpose --
unfortunately in the latest release it's not near the other
STDWIN-related lines so it's easy to miss it.

4.13. Q. What GUI toolkits exist for Python?

A. Depending on what platform(s) you are aiming at, there are several.

Currently supported solutions:

- There's a neat object-oriented interface to the Tcl/Tk widget set,
called Tkinter.  It is part of the standard Python distribution and
well-supported -- all you need to do is build and install Tcl/Tk and
enable the _tkinter module and the TKPATH definition in Modules/Setup
when building Python.  This is probably the easiest to install and
use, and the most complete widget set.  It is also very likely that in
the future the standard Python GUI API will be based on or at least
look very much like the Tkinter interface.  For more info about Tk,
including pointers to the source, see the Tcl/Tk home page
<URL:http://www.sunlabs.com/research/tcl/>.  Tcl/Tk is now fully
portable to the Mac and Windows platforms (NT and 95 only); you need
Python 1.4beta3 or later and Tk 4.1patch1 or later.

- There's an interface to X11, including the Athena and Motif widget
sets (and a few individual widgets, like Mosaic's HTML widget and
SGI's GL widget) available from
<URL:ftp://ftp.python.org/pub/python/src/X-extension.tar.gz>.
Support by Sjoerd Mullender <sjoerd@cwi.nl>.

- On top of the X11 interface there's the (recently revived) vpApp
toolkit by Per Spilling, now also maintained by Sjoerd Mullender
<sjoerd@cwi.nl>.  See <URL:ftp://ftp.cwi.nl/pub/sjoerd/vpApp.tar.gz>.

- The Mac port has a rich and ever-growing set of modules that support
the native Mac toolbox calls.  See the documentation that comes with
the Mac port.  See <URL:ftp://ftp.python.org/pub/python/mac>.  Support
by Jack Jansen <jack@cwi.nl>.

- The NT port supported by Mark Hammond <MHammond@skippinet.com.au>
(see question 7.2) includes an interface to the Microsoft Foundation
Classes and a Python programming environment using it that's written
mostly in Python.  See
<URL:ftp://ftp.python.org/pub/python/pythonwin/>.

- There's an object-oriented GUI based on the Microsoft Foundation
Classes model called WPY, supported by Jim Ahlstrom <jim@interet.com>.
Programs written in WPY run unchanged and with native look and feel on
Windows NT/95, Windows 3.1 (using win32s), and on Unix (using Tk).
Source and binaries for Windows and Linux are available in
<URL:ftp://ftp.python.org/pub/python/wpy/>.

Obsolete or minority solutions:

- There's an interface to wxWindows.  wxWindows is a portable GUI
class library written in C++.  It supports XView, Motif, MS-Windows as
targets.  There is some support for Macs and CURSES as well.
wxWindows preserves the look and feel of the underlying graphics
toolkit.  See the wxPython WWW page at
<URL:http://www.aiai.ed.ac.uk/~jacs/wx/wxpython/wxpython.html>.
Support for wxPython (by Harri Pasanen <pa@tekla.fi>) appears
to have a low priority.

- For SGI IRIX only, there are unsupported interfaces to the complete
GL (Graphics Library -- low level but very good 3D capabilities) as
well as to FORMS (a buttons-and-sliders-etc package built on top of GL
by Mark Overmars -- ftp'able from
<URL:ftp://ftp.cs.ruu.nl/pub/SGI/FORMS/>).  This is probably also
becoming obsolete, as OpenGL takes over.

- There's an interface to STDWIN, a platform-independent low-level
windowing interface for Mac and X11.  This is totally unsupported and
rapidly becoming obsolete.  The STDWIN sources are at
<URL:ftp://ftp.cwi.nl/pub/stdwin/>.  (For info about STDWIN 2.0,
please refer to Steven Pemberton <steven@cwi.nl> -- I believe it is
also dead.)

- There once was an interface to WAFE, a Tcl interface to the X11
Motif and Athena widget sets.  WAFE is at
<URL:ftp://ftp.wu-wien.ac.at/pub/src/X11/wafe/>.  It's not clear what
the status of the Python support is.

- (The Fresco port that was mentioned in earlier versions of this FAQ
no longer seems to exist.  Inquire with Mark Linton.)

4.14. Q. Are there any interfaces to database packages in Python?

A. There's a whole collection of them in the contrib area of the ftp
server, see <URL:http://www.python.org/ftp/python/contrib/Database/>.

4.15. Q. Is it possible to write obfuscated one-liners in Python?

A. Yes.  See the following three examples, due to Ulf Bartelt:

        # Primes < 1000
        print filter(None,map(lambda y:y*reduce(lambda x,y:x*y!=0,
        map(lambda x,y=y:y%x,range(2,int(pow(y,0.5)+1))),1),range(2,1000)))

        # First 10 Fibonacci numbers
        print map(lambda x,f=lambda x,f:(x<=1) or (f(x-1,f)+f(x-2,f)): f(x,f),
        range(10))

        # Mandelbrot set
        print (lambda Ru,Ro,Iu,Io,IM,Sx,Sy:reduce(lambda x,y:x+y,map(lambda y,
        Iu=Iu,Io=Io,Ru=Ru,Ro=Ro,Sy=Sy,L=lambda yc,Iu=Iu,Io=Io,Ru=Ru,Ro=Ro,i=IM,
        Sx=Sx,Sy=Sy:reduce(lambda x,y:x+y,map(lambda x,xc=Ru,yc=yc,Ru=Ru,Ro=Ro,
        i=i,Sx=Sx,F=lambda xc,yc,x,y,k,f=lambda xc,yc,x,y,k,f:(k<=0)or (x*x+y*y
        >=4.0) or 1+f(xc,yc,x*x-y*y+xc,2.0*x*y+yc,k-1,f):f(xc,yc,x,y,k,f):chr(
        64+F(Ru+x*(Ro-Ru)/Sx,yc,0,0,i)),range(Sx))):L(Iu+y*(Io-Iu)/Sy),range(Sy
        ))))(-2.1, 0.7, -1.2, 1.2, 30, 80, 24)
        #    \___ ___/  \___ ___/  |   |   |__ lines on screen
        #        V          V      |   |______ columns on screen
        #        |          |      |__________ maximum of "iterations"
        #        |          |_________________ range on y axis
        #        |____________________________ range on x axis

Don't try this at home, kids!

4.16. Q. Is there an equivalent of C's "?:" ternary operator?

A. Not directly.  In many cases you can mimic a?b:c with "a and b or
c", but there's a flaw: if b is zero (or empty, or None -- anything
that tests false) then c will be selected instead.  In many cases you
can prove by looking at the code that this can't happen (e.g. because
b is a constant or has a type that can never be false), but in general
this can be a problem.

Tim Peters (who wishes it was Steve Majewski) suggested the following
solution: (a and [b] or [c])[0].  Because [b] is a singleton list it
is never false, so the wrong path is never taken; then applying [0] to
the whole thing gets the b or c that you really wanted.  Ugly, but it
gets you there in the rare cases where it is really inconvenient to
rewrite your code using 'if'.

4.17. Q. My class defines __del__ but it is not called when I delete the
object.

A. There are several possible reasons for this.

- The del statement does not necessarily call __del__ -- it simply
decrements the object's reference count, and if this reaches zero
__del__ is called.

- If your data structures contain circular links (e.g. a tree where
each child has a parent pointer and each parent has a list of
children) the reference counts will never go back to zero.  You'll
have to define an explicit close() method which removes those
pointers.  Please don't ever call __del__ directly -- __del__ should
call close() and close() should make sure that it can be called more
than once for the same object.

- If the object has ever been a local variable (or argument, which is
really the same thing) to a function that caught an expression in an
except clause, chances are that a reference to the object still exists
in that function's stack frame as contained in the stack trace.
Normally, deleting (better: assigning None to) sys.exc_traceback will
take care of this.  If you a stack was printed for an unhandled
exception in an interactive interpreter, delete sys.last_traceback
instead.

- There is code that deletes all objects when the interpreter exits,
but if your Python has been configured to support threads, it is not
called (because other threads may still be active).  You can define
your own cleanup function using sys.exitfunc (see question 4.4).

- Finally, if your __del__ method raises an exception, this will be
ignored.  Starting with Python 1.4beta3, a warning message is printed
to sys.stderr when this happens.

4.18. Q. How do I change the shell environment for programs called
using os.popen() or os.system()?  Changing os.environ doesn't work.

A. Modifying the environment passed to subshells was left out of the
interpreter because there seemed to be no well-established portable
way to do it (in particular, some systems, have putenv(), others have
setenv(), and some have none at all).

However if all you want is to pass environment variables to the
commands run by os.system() or os.popen(), there's a simple solution:
prefix the command string with a couple of variable assignments and
export statements.  The following would be universal for popen:

        import os
        from commands import mkarg # nifty routine to add shell quoting
        def epopen(cmd, mode, env = {}):
                # env is a dictionary of environment variables
                prefix = ''
                for key, value in env.items():
                        prefix = prefix + '%s=%s\n' % (key, mkarg(value)[1:])
                        prefix = prefix + 'export %s\n' % key
                return os.popen(prefix + cmd, mode)

4.19. Q. What is a class?

A. A class is the particular object type that is created by executing
a class statement.  Class objects are used as templates, to create
class instance objects, which embody both the data structure and
program routines specific to a datatype.

4.20. Q. What is a method?

A. A method is a function that you normally call as
x.name(arguments...) for some object x.  The term is used for methods
of classes and class instances as well as for methods of built-in
objects.  (The latter have a completely different implementation and
only share the way their calls look in Python code.)  Methods of
classes (and class instances) are defined as functions inside the
class definition.

4.21. Q. What is self?

A. Self is merely a conventional name for the first argument of a
method -- i.e. a function defined inside a class definition.  A method
defined as meth(self, a, b, c) should be called as x.meth(a, b, c) for
some instance x of the class in which the definition occurs;
the called method will think it is called as meth(x, a, b, c).

4.22. Q. What is a unbound method?

A. An unbound method is a method defined in a class that is not yet
bound to an instance.  You get an unbound method if you ask for a
class attribute that happens to be a function. You get a bound method
if you ask for an instance attribute.  A bound method knows which
instance it belongs to and calling it supplies the instance automatically;
an unbound method only knows which class it wants for its first
argument (a derived class is also OK).  Calling an unbound method
doesn't "magically" derive the first argument from the context -- you
have to provide it explicitly.

4.23. Q. How do I call a method defined in a base class from a derived
class that overrides it?

A. If your class definition starts with "class Derived(Base): ..."
then you can call method meth defined in Base (or one of Base's base
classes) as Base.meth(self, arguments...).  Here, Base.meth is an
unbound method (see previous question).

4.24. Q. How do I call a method from a base class without using the
name of the base class?

A. DON'T DO THIS.  REALLY.  I MEAN IT.  It appears that you could call
self.__class__.__bases__[0].meth(self, arguments...) but this fails when
a doubly-derived method is derived from your class: for its instances,
self.__class__.__bases__[0] is your class, not its base class -- so
(assuming you are doing this from within Derived.meth) you would start
a recursive call.

4.25. Q. How can I organize my code to make it easier to change the base
class?

A. You could define an alias for the base class, assign the real base
class to it before your class definition, and use the alias throughout
your class.  Then all you have to change is the value assigned to the
alias.  Incidentally, this trick is also handy if you want to decide
dynamically (e.g. depending on availability of resources) which base
class to use.  Example:

        BaseAlias = <real base class>
        class Derived(BaseAlias):
                def meth(self):
                        BaseAlias.meth(self)
                        ...

4.26. Q. How can I find the methods or attributes of an object?

A. This depends on the object type.

For an instance x of a user-defined class, instance attributes are
found in the dictionary x.__dict__, and methods and attributes defined
by its class are found in x.__class__.__bases__[i].__dict__ (for i in
range(len(x.__class__.__bases__))).  You'll have to walk the tree of
base classes to find *all* class methods and attributes.

Many, but not all built-in types define a list of their method names
in x.__methods__, and if they have data attributes, their names may be
found in x.__members__.  However this is only a convention.

For more information, read the source of the standard (but
undocumented) module newdir.

4.27. Q. I can't seem to use os.read() on a pipe created with os.popen().

A. os.read() is a low-level function which takes a file descriptor (a
small integer).  os.popen() creates a high-level file object -- the
same type used for sys.std{in,out,err} and returned by the builtin
open() function.  Thus, to read n bytes from a pipe p created with
os.popen(), you need to use p.read(n).

4.28. Q. How can I create a stand-alone binary from a Python script?

The demo script "Demo/scripts/freeze.py" does what you want.  (It's
actually not a demo but a support tool -- there is some extra code in
the interpreter to accommodate it.)  It requires that you have the
Python build tree handy, complete with all the lib*.a files.

This works by scanning your source recursively for import statements
(both forms) and looking for the modules on the standard Python path
as well as in the source directory (for built-in modules).  It then
"compiles" the modules written in Python to C code (array initializers
that can be turned into code objects using the marshal module) and
creates a custom-made config file that only contains those built-in
modules which are actually used in the program.  It then compiles the
generated C code and links it with the rest of the Python interpreter
to form a self-contained binary which acts exactly like your script.

Hint: the freeze program only works if your script's filename ends in
".py".

4.29. Q. What WWW tools are there for Python?

A. See the chapter titled "Internet and WWW" in the Library Reference
Manual.  There's also a web browser written in Python, called Grail --
see <URL:http://grail.cnri.reston.va.us/grail/>.

Steve Miale <smiale@cs.indiana.edu> has written a modular WWW browser
called Dancer.  An alpha version can be FTP'ed from
<URL:ftp://ftp.cs.indiana.edu/pub/smiale/dancer.tar.gz>.  (There are a
few articles about Dancer in the (hyper)mail archive
<URL:http://www.cwi.nl/~guido/hypermail/python-1994q3/index.html>.)

4.30. Q. How do I run a subprocess with pipes connected to both input
and output?

A. This is really a UNIX question.  Also, in general, it is unwise to
do so, because you can easily cause a deadlock where the parent
process is blocked waiting for output from the child, while the child
is blocked waiting for input from the child.  This can be caused
because the parent expects the child to output more text than it does,
or it can be caused by data being stuck in stdio buffers due to lack
of flushing.  The Python parent can of course explicitly flush the data
it sends to the child before it reads any output, but if the child is
a naive C program it can easily have been written to never explicitly
flush its output, even if it is interactive, since flushing is
normally automatic.

In many cases, all you really need is to run some data through a
command and get the result back.  Unless the data is infinite in size,
the easiest (and often the most efficient!) way to do this is to write
it to a temporary file and run the command with that temporary file as
input.  The standard module tempfile exports a function mktemp() which
generates unique temporary file names.

If after reading all of the above you still want to connect two pipes
to a subprocess's standard input and output, here's a simple solution,
due to Jack Jansen:

        import os
        import sys
        import string

        MAXFD = 100     # Max number of file descriptors in this system

        def popen2(cmd):
                cmd = string.split(cmd)
                p2cread, p2cwrite = os.pipe()
                c2pread, c2pwrite = os.pipe()
                pid = os.fork()
                if pid == 0:
                        # Child
                        os.close(0)
                        os.close(1)
                        if os.dup(p2cread) != 0:
                                sys.stderr.write('popen2: bad read dup\n')
                        if os.dup(c2pwrite) != 1:
                                sys.stderr.write('popen2: bad write dup\n')
                        for i in range(3, MAXFD):
                                try:
                                        os.close(i)
                                except:
                                        pass
                        try:
                                os.execv(cmd[0], cmd)
                        finally:
                                os._exit(1)
                os.close(p2cread)
                tochild = os.fdopen(p2cwrite, 'w')
                os.close(c2pwrite)
                fromchild = os.fdopen(c2pread, 'r')
                return fromchild, tochild

Note that many interactive programs (e.g. vi) don't work well with
pipes substituted for standard input and output.  You will have to use
pseudo ttys ("ptys") instead of pipes.  There is some undocumented
code to use these in the library module pty.py -- I'm afraid you're on
your own here.

A different answer is a Python interface to Don Libes' "expect"
library.  A prerelease of this is available on the Python ftp mirror
sites in the contrib subdirectory as expy-0.3.tar.gz, e.g.
<URL:ftp://ftp.python.org/pub/python/contrib/expy-0.3.tar.gz>.

4.31. Q. How do I call a function if I have the arguments in a tuple?

A. Use the built-in function apply().  For instance,

    func(1, 2, 3)

is equivalent to

    args = (1, 2, 3)
    apply(func, args)

Note that func(args) is not the same -- it calls func() with exactly
one argument, the tuple args, instead of three arguments, the integers
1, 2 and 3.

4.32. Q. How do I enable font-lock-mode for Python in Emacs?

A. Assuming you're already using python-mode and font-lock-mode
separately, all you need to do is put this in your .emacs file:

        (defun my-python-mode-hook ()
          (setq font-lock-keywords python-font-lock-keywords)
          (font-lock-mode 1))
        (add-hook 'python-mode-hook 'my-python-mode-hook)

4.33. Q. Is there an inverse to the format operator (a la C's scanf())?

A. Not as such.

For simple input parsing, the easiest approach is usually to split
the line into whitespace-delimited words using string.split(), and to
convert decimal strings to numeric values using string.atoi(),
string.atol() or string.atof().  (Python's atoi() is 32-bit and its
atol() is arbitrary precision.)  If you want to use another delimiter
than whitespace, use string.splitfield() (possibly combining it with
string.strip() which removes surrounding whitespace from a string).

For more complicated input parsing, regular expressions (see module
regex) are better suited and more powerful than C's scanf().

4.34. Q. Can I have Tk events handled while waiting for I/O?

A. Yes, and you don't even need threads!  But you'll have to
restructure your I/O code a bit.  Tk has the equivalent of Xt's
XtAddInput() call, which allows you to register a callback function
which will be called from the Tk mainloop when I/O is possible on a
file descriptor.  Here's what you need:

        from Tkinter import tkinter
        tkinter.createfilehandler(file, mask, callback)

The file may be a Python file or socket object (actually, anything
with a fileno() method), or an integer file descriptor.  The mask is
one of the constants tkinter.READABLE or tkinter.WRITABLE.  The
callback is called as follows:

        callback(file, mask)

You must unregister the callback when you're done, using

        tkinter.deletefilehandler(file)

Note: since you don't know *how many bytes* are available for reading,
you can't use the Python file object's read or readline methods, since
these will insist on reading a predefined number of bytes.  For
sockets, the recv() or recvfrom() methods will work fine; for other
files, use os.read(file.fileno(), maxbytecount).

4.35. Q. How do I write a function with output parameters (call by reference)?

A. [Mark Lutz] The thing to remember is that arguments are passed by
assignment in Python.  Since assignment just creates references to
objects, there's no alias between an argument name in the caller and
callee, and so no call-by-reference per se.  But you can simulate it
in a number of ways:

1) By using global variables; but you probably shouldn't :-)

2) By passing a mutable (changeable in-place) object:

      def func1(a):
          a[0] = 'new-value'     # 'a' references a mutable list
          a[1] = a[1] + 1        # changes a shared object

      args = ['old-value', 99]
      func1(args)
      print args[0], args[1]     # output: new-value 100

3) By return a tuple, holding the final values of arguments:

      def func2(a, b):
          a = 'new-value'        # a and b are local names
          b = b + 1              # assigned to new objects
          return a, b            # return new values

      x, y = 'old-value', 99
      x, y = func2(x, y)
      print x, y                 # output: new-value 100

4) And other ideas that fall-out from Python's object model. For
   instance, it might be clearer to pass in a mutable dictionary:

      def func3(args):
          args['a'] = 'new-value'     # args is a mutable dictionary
          args['b'] = args['b'] + 1   # change it in-place

      args = {'a':' old-value', 'b': 99}
      func3(args)
      print args['a'], args['b']

5) Or bundle-up values in a class instance:

      class callByRef:
          def __init__(self, **args):
              for (key, value) in args.items():
                  setattr(self, key, value)

      def func4(args):
          args.a = 'new-value'        # args is a mutable callByRef
          args.b = args.b + 1         # change object in-place

      args = callByRef(a='old-value', b=99)
      func4(args)
      print args.a, args.b

   But there's probably no good reason to get this complicated :-).

[Python' author favors solution 3 in most cases.]

4.36. Q. Please explain the rules for local and global variables in Python.

A. [Ken Manheimer] In Python, procedure variables are implicitly
global, unless they assigned anywhere within the block.  In that case
they are implicitly local, and you need to explicitly declare them as
'global'.

Though a bit surprising at first, a moments consideration explains
this.  On one hand, requirement of 'global' for assigned vars provides
a bar against unintended side-effects.  On the other hand, if global
were required for all global references, you'd be using global all the
time.  Eg, you'd have to declare as global every reference to a
builtin function, or to a component of an imported module.  This
clutter would defeat the usefulness of the 'global' declaration for
identifying side-effects.

4.37. Q. How can I have modules that mutually import each other?

A. Jim Roskind recommends the following order in each module:

First: all exports (like globals, functions, and classes that don't
need imported bases classes).

Then: all import statements.

Finally: all active code (including globals that are initialized from
imported values).

Python's author doesn't like this approach much because the imports
appear in a strange place, but has to admit that it works.  His
recommended strategy is to avoid all uses of "from <module> import *"
(so everything from an imported module is referenced as
<module>.<name>) and to place all code inside functions.
Initializations of global variables and class variables should use
constants or built-in functions only.

4.38. Q. How do I copy an object in Python?

A. There is no generic copying operation built into Python, however
most object types have some way to create a clone.  Here's how for the
most common objects:

- For immutable objects (numbers, strings, tuples), cloning is
unnecessary since their value can't change.

- For lists (and generally for mutable sequence types), a clone is
created by the expression l[:].

- For dictionaries, the following function returns a clone:

        def dictclone(o):
            n = {}
            for k in o.keys(): n[k] = o[k]
            return n

- Finally, for generic objects, the "copy" module defines two
functions for copying objects.  copy.copy(x) returns a copy as shown
by the above rules.  copy.deepcopy(x) also copies the elements of
composite objects.  See the section on this module in the Library
Reference Manual.

4.39. Q. How to implement persistent objects in Python?  (Persistent ==
automatically saved to and restored from disk.)

A. The library module "pickle" now solves this in a very general way
(though you still can't store things like open files, sockests or
windows), and the library module "shelve" uses pickle and (g)dbm to
create presistent mappings containing arbitrary Python objects.

4.40. Q. I try to use __spam and I get an error about _SomeClassName__spam.

A. Variables with double leading underscore are "mangled" to provide a
simple but effective way to define class private variables.  See the
chapter "New in Release 1.4" in the Python Tutorial.

4.41. Q. How do I delete a file?  And other file questions.

A. Use os.remove(filename) or os.unlink(filename); for documentation,
see the posix section of the library manual.  They are the same,
unlink() is simply the Unix name for this function.  In earlier
versions of Python, only os.unlink() was available.

To remove a directory, use os.rmdir(); use os.mkdir() to create one.

To rename a file, use os.rename().

To truncate a file, open it using f = open(filename, "w+"), and use
f.truncate(offset); offset defaults to the current seek position.
There's also os.ftruncate(fd, offset) for files opened with os.open()
-- for advanced Unix hacks only.


5. Extending Python
===================

5.1. Q. Can I create my own functions in C?

A. Yes, you can create built-in modules containing functions,
variables, exceptions and even new types in C.  This is explained in
the document "Extending and Embedding the Python Interpreter" (the
LaTeX file Doc/ext.tex).  Also read the chapter on dynamic loading.

5.2. Q. Can I create my own functions in C++?

A. Yes, using the C-compatibility features found in C++.  Basically
you place extern "C" { ... } around the Python include files and put
extern "C" before each function that is going to be called by the
Python interpreter.  Global or static C++ objects with constructors
are probably not a good idea.

5.3. Q. How can I execute arbitrary Python statements from C?

A. The highest-level function to do this is run_command() which takes
a single string argument which is executed in the context of module
__main__ and returns 0 for success and -1 when an exception occurred
(including SyntaxError).  If you want more control, use run_string();
see the source for run_command() in Python/pythonrun.c.

5.4. Q. How can I evaluate an arbitrary Python expression from C?

A. Call the function run_string() from the previous question with the
start symbol eval_input; it then parses an expression, evaluates it
and returns its value.  See exec_eval() in Python/bltinmodule.c.

5.5. Q. How do I extract C values from a Python object?

A. That depends on the object's type.  If it's a tuple,
gettuplesize(o) returns its length and gettupleitem(o, i) returns its
i'th item; similar for lists with getlistsize(o) and getlistitem(o,
i).  For strings, getstringsize(o) returns its length and
getstringvalue(o) a pointer to its value (note that Python strings may
contain null bytes so strlen() is not safe).  To test which type an
object is, first make sure it isn't NULL, and then use
is_stringobject(o), is_tupleobject(o), is_listobject(o) etc.

5.6. Q. How do I use mkvalue() to create a tuple of arbitrary length?

A. You can't.  Use t = newtupleobject(n) instead, and fill it with
objects using settupleitem(t, i, o) -- note that this "eats" a
reference count of o.  Similar for lists with newlistobject(n) and
setlistitem(l, i, o).  Note that you *must* set all the tuple items to
some value before you pass the tuple to Python code --
newtupleobject(n) initializes them to NULL, which isn't a valid Python
value.

5.7. Q. How do I call an object's method from C?

A. Here's a function (untested) that might become part of the next
release in some form.  It uses <stdarg.h> to allow passing the
argument list on to vmkvalue():

        object *call_method(object *inst, char *methodname, char *format, ...)
        {
                object *method;
                object *args;
                object *result;
                va_list va;
                method = getattr(inst, methodname);
                if (method == NULL) return NULL;
                va_start(va, format);
                args = vmkvalue(format, va);
                va_end(va);
                if (args == NULL) {
                        DECREF(method);
                        return NULL;
                }
                result = call_object(method, args);
                DECREF(method);
                DECREF(args);
                return result;
        }

This works for any instance that has methods -- whether built-in or
user-defined.  You are responsible for eventually DECREF'ing the
return value.

To call, e.g., a file object's "seek" method with arguments 10, 0
(assuming the file object pointer is "f"):

        res = call_method(f, "seek", "(OO)", 10, 0);
        if (res == NULL) {
                ... an exception occurred ...
        }
        else {
                DECREF(res);
        }

Note that since call_object() *always* wants a tuple for the argument
list, to call a function without arguments, pass "()" for the format,
and to call a function with one argument, surround the argument in
parentheses, e.g. "(i)".

5.8. Q. How do I catch the output from print_error()?

A. (Due to Mark Hammond):

* in Python code, define an object that supports the "write()" method.

* redirect sys.stdout and sys.stderr to this object.

* call print_error, or just allow the standard traceback mechanism to
work.

Then, the output will go wherever your write() method sends it.

5.9. Q. How do I access a module written in Python from C?

A. You can get a pointer to the module object as follows:

        module = import_module("<modulename>");

If the module hasn't been imported yet (i.e. it is not yet present in
sys.modules), this initializes the module; otherwise it simply returns
the value of sys.modules["<modulename>"].  Note that it doesn't enter
the module into any namespace -- it only ensures it has been
initialized and is stored in sys.modules.

You can then access the module's attributes (i.e. any name defined in
the module) as follows:

        attr = getattr(module, "<attrname>");

Calling setattr(), to assign to variables in the module, also works.

5.10. Q. How do I interface to C++ objects from Python?

A. Depending on your requirements, there are many approaches.  Begin
by reading the "Extending and Embedding" document (Doc/ext.tex, see
also <URL:http://www.python.org/doc/>).  Realize that for the Python
run-time system, there isn't a whole lot of difference between C and
C++ -- so the strategy to build a new Python type around a C structure
(pointer) type will also work for C++ objects.

Automatic generation of interfaces between Python and C++ is still at
the horizon -- parsing C++ header files requires an almost complete
C++ parser, and many features aren't easily translated from C++ to
Python: certain forms of operator oveloading, function overloading
(best approached by a varargs function which explicitly type-checks
its arguments), and reference arguments are just a number of features
that are hard to translate correctly if at all.

The hardest problem is to transparently translate the C++ class
hierarchy to Python, so that Python programs derive classes from C++
classes.  Given suitable constraints, this may be possible, but it
would require more space than I have in this FAQ to explain how.
In any case, you can get quite a bit done without this, using just the
existing classes from Python.

If this all seems rather daunting, that may be because it is -- C++
isn't exactly a baby to handle without gloves!  However, people have
accomplished amazing feats of interfacing between Python and C++, and
a detailed question posted to the Python list is likely to elicit some
interesting and useful responses.


6. Python's design
==================

6.1. Q. Why isn't there a switch or case statement in Python?

A. You can do this easily enough with a sequence of
if... elif... elif... else.  There have been some proposals for switch
statement syntax, but there is no consensus (yet) on whether and how
to do range tests.

6.2. Q. Why does Python use indentation for grouping of statements?

A. Basically I believe that using indentation for grouping is
extremely elegant and contributes a lot to the clarity of the average
Python program.  Most people learn to love this feature after a while.
Some arguments for it:

- Since there are no begin/end brackets there cannot be a disagreement
between grouping perceived by the parser and the human reader.  I
remember long ago seeing a C fragment like this:

        if (x <= y)
                x++;
                y--;
        z++;

and staring a long time at it wondering why y was being decremented
even for x > y...  (And I wasn't a C newbie then either.)

- Since there are no begin/end brackets, Python is much less prone to
coding-style conflicts.  In C there are loads of different ways to
place the braces (including the choice whether to place braces around
single statements in certain cases, for consistency).  If you're used
to reading (and writing) code that uses one style, you will feel at
least slightly uneasy when reading (or being required to write)
another style.

- Many coding styles place begin/end brackets on a line by themself.
This makes programs considerably longer and wastes valuable screen
space, making it harder to get a good overview over a program.
Ideally, a function should fit on one basic tty screen (say, 20
lines).  20 lines of Python are worth a LOT more than 20 lines of C.
This is not solely due to the lack of begin/end brackets (the lack of
declarations also helps, and the powerful operations of course), but
it certainly helps!

6.3. Q. Why are Python strings immutable?

A. There are two advantages.  One is performance: knowing that a
string is immutable makes it easy to lay it out at construction time
-- fixed and unchanging storage requirements.  (This is also one of
the reasons for the distinction between tuples and lists.)  The
other is that strings in Python are considered as "elemental" as
numbers.  No amount of activity will change the value 8 to anything
else, and in Python, no amount of activity will change the string
"eight" to anything else.  (Adapted from Jim Roskind)

6.4. Q. Why don't strings have methods like index() or sort(), like
lists?

A. Good question.  Strings currently don't have methods at all
(likewise tuples and numbers).  Long ago, it seemed unnecessary to
implement any of these functions in C, so a standard library module
"string" written in Python was created that performs string related
operations.  Since then, the cry for performance has moved most of
them into the built-in module strop (this is imported by module
string, which is still the preferred interface, without loss of
performance except during initialization).  Some of these functions
(e.g. index()) could easily be implemented as string methods instead,
but others (e.g. sort()) can't, since their interface prescribes that
they modify the object, while strings are immutable (see the previous
question).

6.5. Q. Why does Python use methods for some functionality
(e.g. list.index()) but functions for other (e.g. len(list))?

A. Functions are used for those operations that are generic for a
group of types and which should work even for objects that don't have
methods at all (e.g. numbers, strings, tuples).  Also, implementing
len(), max(), min() as a built-in function is actually less code than
implementing them as methods for each type.  One can quibble about
individual cases but it's really too late to change such things
fundamentally now.

6.6. Q. Why can't I derive a class from built-in types (e.g. lists or
files)?

A. This is caused by the relatively late addition of (user-defined)
classes to the language -- the implementation framework doesn't easily
allow it.  See the answer to question 4.2 for a work-around.  This
*may* be fixed in the (distant) future.

6.7. Q. Why must 'self' be declared and used explicitly in method
definitions and calls?

A. By asking this question you reveal your C++ background. :-)
When I added classes, this was (again) the simplest way of
implementing methods without too many changes to the interpreter.  I
borrowed the idea from Modula-3.  It turns out to be very useful, for
a variety of reasons.

First, it makes it more obvious that you are using a method or
instance attribute instead of a local variable.  Reading "self.x" or
"self.meth()" makes it absolutely clear that an instance variable or
method is used even if you don't know the class definition by heart.
In C++, you can sort of tell by the lack of a local variable
declaration (assuming globals are rare or easily recognizable) -- but
in Python, there are no local variable declarations, so you'd have to
look up the class definition to be sure.

Second, it means that no special syntax is necessary if you want to
explicitly reference or call the method from a particular class.  In
C++, if you want to use a method from base class that is overridden in
a derived class, you have to use the :: operator -- in Python you can
write baseclass.methodname(self, <argument list>).  This is
particularly useful for __init__() methods, and in general in cases
where a derived class method wants to extend the base class method of
the same name and thus has to call the base class method somehow.

Lastly, for instance variables, it solves a syntactic problem with
assignment: since local variables in Python are (by definition!) those
variables to which a value assigned in a function body (and that
aren't explicitly declared global), there has to be some way to tell
the interpreter that an assignment was meant to assign to an instance
variable instead of to a local variable, and it should preferably be
syntactic (for efficiency reasons).  C++ does this through
declarations, but Python doesn't have declarations and it would be a
pity having to introduce them just for this purpose.  Using the
explicit "self.var" solves this nicely.  Similarly, for using instance
variables, having to write "self.var" means that references to
unqualified names inside a method don't have to search the instance's
directories.

6.8. Q. Can't you emulate threads in the interpreter instead of
relying on an OS-specific thread implementation?

A. Unfortunately, the interpreter pushes at least one C stack frame
for each Python stack frame.  Also, extensions can call back into
Python at almost random moments.  Therefore a complete threads
implementation requires thread support for C.

6.9. Q. Why can't lambda forms contain statements?

A. Python lambda forms cannot contain statements because Python's
syntactic framework can't handle statements nested inside expressions.

However, in Python, this is not a serious problem.  Unlike lambda
forms in other languages, where they add functionality, Python lambdas
are only a shorthand notation if you're too lazy to define a function.

Functions are already first class objects in Python, and can be
declared in a local scope.  Therefore the only advantage of using a
lambda form instead of a locally-defined function is that you'll have
to invent a name for the function -- but that's just a local variable
to which the function object (which is exactly the same type of object
that a lambda form yields) is assigned!

6.10. Q. Why don't lambdas have access to variables defined in the
containing scope?

A. Because they are implemented as ordinary functions.
See question 4.5 above.

6.11. Q. Why can't recursive functions be defined inside other functions?

A. See question 4.5 above.

6.12. Q. Why is there no more efficient way of iterating over a dictionary
than first constructing the list of keys()?

A. Have you tried it?  I bet it's fast enough for your purposes!  In
most cases such a list takes only a few percent of the space occupied
by the dictionary -- it needs only 4 bytes (the size of a pointer) per
key -- a dictionary costs 8 bytes per key plus between 30 and 70
percent hash table overhead, plus the space for the keys and values --
by necessity all keys are unique objects and a string object (the most
common key type) costs at least 18 bytes plus the length of the
string.  Add to that the values contained in the dictionary, and you
see that 4 bytes more per item really isn't that much more memory...

A call to dict.keys() makes one fast scan over the dictionary
(internally, the iteration function does exist) copying the pointers
to the key objects into a pre-allocated list object of the right size.
The iteration time isn't lost (since you'll have to iterate anyway --
unless in the majority of cases your loop terminates very prematurely
(which I doubt since you're getting the keys in random order).

I don't expose the dictionary iteration operation to Python
programmers because the dictionary shouldn't be modified during the
entire iteration -- if it is, there's a very small chance that the
dictionary is reorganized because the hash table becomes too full, and
then the iteration may miss some items and see others twice.  Exactly
because this only occurs rarely, it would lead to hidden bugs in
programs: it's easy never to have it happen during test runs if you
only insert or delete a few items per iteration -- but your users will 
surely hit upon it sooner or later.

6.13. Q. Can Python be compiled to machine code, C or some other language?

A. Not easily.  Python's high level data types, dynamic typing of
objects and run-time invocation of the interpreter (using eval() or
exec) together mean that a "compiled" Python program would probably
consist mostly of calls into the Python run-time system, even for
seemingly simple operations like "x+1".  Thus, the performance gain
would probably be minimal.

Internally, Python source code is always translated into a "virtual
machine code" or "byte code" representation before it is interpreted
(by the "Python virtual machine" or "bytecode interpreter").  In order
to avoid the overhead of parsing and translating modules that rarely
change over and over again, this byte code is written on a file whose
name ends in ".pyc" whenever a module is parsed (from a file whose
name ends in ".py").  When the corresponding .py file is changed, it
is parsed and translated again and the .pyc file is rewritten.  There
is no performance difference once the .pyc file has been loaded (the
bytecode read from the .pyc file is exactly the same as the bytecode
created by direct translation).  The only difference is that loading
code from a .pyc file is faster than parsing and translating a .py
file, so the presence of precompiled .pyc files will generally improve
start-up time of Python scripts.  If desired, the Lib/compileall.py
module/script can be used to force creation of valid .pyc files for a
given set of modules.

If you are looking for a way to translate Python programs in order to
distribute them in binary form, without the need to distribute the
interpreter and library as well, have a look at the freeze.py script
in the Tools/freeze directory.  This creates a single binary file
incorporating your program, the Python interpreter, and those parts of
the Python library that are needed by your program.  Of course, the
resulting binary will only run on the same type of platform as that
used to create it.

Hints for proper usage of freeze.py:

- the script must be in a file whose name ends in .py

- you must have installed Python fully:

        make install
        make libinstall
        make inclinstall
        make libainstall

6.14. Q. Why doesn't Python use proper garbage collection?

A. It's looking less and less likely that Python will ever get
"automatic" garbage collection (GC).  For one thing, unless this were
added to C as a standard feature, it's a portability pain in the ass.
And yes, I know about the Xerox library.  It has bits of assembler
code for *most* *common* platforms.  Not for all.  And although it is
mostly transparent, it isn't completely transparent (when I once
linked Python with it, it dumped core).

"Proper" GC also becomes a problem when Python gets embedded into
other applications.  While in a stand-alone Python it may be fine to
replace the standard malloc() and free() with versions provided by the
GC library, an application embedding Python may want to have its *own*
substitute for malloc() and free(), and may not want Python's.  Right
now, Python works with anything that implements malloc() and free()
properly.

Besides, the predictability of destructor calls in Python is kind of
attractive.  With GC, the following code (which is fine in current
Python) will run out of file descriptors long before it runs out of
memory:

        for file in <very long list of files>:
                f = open(file)
                c = file.read(1)

Using the current reference counting and destructor scheme, each new
assignment to f closes the previous file.  Using GC, this is not
guaranteed.  Sure, you can think of ways to fix this.  But it's not
off-the-shelf technology.


7. Using Python on non-UNIX platforms
=====================================

7.1. Q. Is there a Mac version of Python?

A. Yes, see the "mac" subdirectory of the distribution sites,
e.g. <URL:ftp://ftp.python.org/pub/python/mac/>.

7.2. Q. Are there DOS and Windows versions of Python?

A. Yes.  There is a plethora of not-always-compatible versions.  See
the "pythonwin", "wpy", "nt" and "pc" subdirectories of the
distribution sites.  A quick comparison:

PythonWin: Extensive support for the 32-bit native Windows API and GUI
building using MFC.  Windows NT and Windows 95 only (and Windows
3.1(1) using win32s, until Microsoft stops supporting it :-( ).
<URL:ftp://ftp.python.org/pub/python/pythonwin/>.

WPY: Ports to DOS, Windows 3.1(1), Windows 95, Windows NT and OS/2.
Also contains a GUI package that offers portability between Windows 
(not DOS) and Unix, and native look and feel on both.
<URL:ftp://ftp.python.org/pub/python/wpy/>.

NT: Basic ports built straight from the 1.4 distribution for Windows
95 and Windows NT.  This will eventually provide core support for
both PythonWin and WPY on all 32-bit Microsoft platforms.
<URL:ftp://ftp.python.org/pub/python/nt/>.

PC: Old, unsupported ports to DOS, Windows 3.1(1) and OS/2.
<URL:ftp://ftp.python.org/pub/python/pc/>.

7.3. Q. Is there an OS/2 version of Python?

A. Yes, see the "pc" and "wpy" subdirectory of the distribution sites
(see above).

7.4. Q. Is there a VMS version of Python?

A. Donn Cave <donn@cac.washington.edu> did a partial port.  The
results of his efforts are on public display in
<<URL:ftp://ftp.python.org/pub/python/contrib/vms.tar.gz/>.  Someone
else is working on a more complete port, for details watch the list.

7.5. Q. What about IBM mainframes, or other non-UNIX platforms?

A. I haven't heard about these, except I remember hearing about an
OS/9 port and a port to Vxworks (both operating systems for embedded
systems).  If you're interested in any of this, go directly to the
newsgroup and ask there, you may find exactly what you need.  For
example, a port to MPE/iX 5.0 on HP3000 computers was just announced,
see <URL:http://www.allegro.com/software/>.

7.6. Q. Where are the source or Makefiles for the non-UNIX versions?

A. The standard sources can (almost) be used.  Additional sources can
be found in the platform-specific subdirectories of the distribution.

7.7. Q. What is the status and support for the non-UNIX versions?

A. I don't have access to most of these platforms, so in general I am
dependent on material submitted by volunteers(*).  However I strive to
integrate all changes needed to get it to compile on a particular
platform back into the standard sources, so porting of the next
version to the various non-UNIX platforms should be easy.

(*) For the Macintosh, that volunteer is me, with help from Jack
Jansen <jack@cwi.nl>.

7.8. Q. I have a PC version but it appears to be only a binary.
Where's the library?

A. You still need to copy the files from the distribution directory
"python/Lib" to your system.  If you don't have the full distribution,
you can get the file lib<version>.tar.gz from most ftp sites carrying
Python; this is a subset of the distribution containing just those
files, e.g.  <URL:ftp://ftp.python.org/pub/python/src/lib1.1.tar.gz>.

Once you have installed the library, you need to point sys.path to it.
Assuming the library is in C:\misc\python\lib, the following commands
will point your Python interpreter to it (note the doubled backslashes
-- you can also use single forward slashes instead):

        >>> import sys
        >>> sys.path.insert(0, 'C:\\misc\\python\\lib')
        >>>

For a more permanent effect, set the environment variable PYTHONPATH,
as follows (talking to a DOS prompt):

        C> SET PYTHONPATH=C:\misc\python\lib

7.9. Q. Where's the documentation for the Mac or PC version?

A.  The documentation for the Unix version also applies to the Mac and
PC versions.  Where applicable, differences are indicated in the text.

7.10. Q. The Mac (PC) version doesn't seem to have any facilities for
creating or editing programs apart from entering it interactively, and
there seems to be no way to save code that was entered interactively.
How do I create a Python program on the Mac (PC)?

A. Use an external editor.  On the Mac, BBEdit seems to be a popular
no-frills text editor.  I work like this: start the interpreter; edit
a module file using BBedit; import and test it in the interpreter;
edit again in BBedit; then use the built-in function reload() to
re-read the imported module; etc.

Regarding the same question for the PC, Kurt Wm. Hemr writes: "While
anyone with a pulse could certainly figure out how to do the same on
MS-Windows, I would recommend the NotGNU Emacs clone for MS-Windows.
Not only can you easily resave and "reload()" from Python after making
changes, but since WinNot auto-copies to the clipboard any text you
select, you can simply select the entire procedure (function) which
you changed in WinNot, switch to QWPython, and shift-ins to reenter
the changed program unit."
