New version: 1.14 (previous oine was misnumbered 1.12).
Lots of new questions about everything.
diff --git a/Misc/FAQ b/Misc/FAQ
index 43866d1..31c76bd 100644
--- a/Misc/FAQ
+++ b/Misc/FAQ
@@ -6,8 +6,8 @@
 Approved: news-answers-request@MIT.Edu
 
 Archive-name: python-faq/part1
-Version: 1.12
-Last-modified: 25 July 1994
+Version: 1.14
+Last-modified: 23 September 1994
 
 This article contains answers to Frequently Asked Questions about
 Python (an object-oriented interpreted programming language -- see
@@ -41,6 +41,9 @@
 message to mail-server@rtfm.mit.edu containing the single word help in
 the message body to receive instructions.
 
+Skip Montanaro <skip@automatrix.com> maintains an HTML version of this
+FAQ.  The URL is "http://www.automatrix.com/~skip/python-faq.html".
+
 This FAQ is divided in the following chapters:
 
  1. General information and availability
@@ -75,8 +78,9 @@
   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.5. Q. When will the next version be released?
+  2.6. Q. What new developments are expected for Python in the future?
+  2.7. Q. Is it reasonable to propose incompatible changes to Python?
 
  3. Building Python
   3.1. Q. Is there a test set?
@@ -90,7 +94,10 @@
   3.6. 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.7. Q. Python built with gcc for the DEC Alpha doesn't work.
-  3.8. Q. Other trouble building Python on platform X.
+  3.8. Q. I use VPATH but some targets are built in the source directory.
+  3.9. Q. Trouble building or linking with the GNU readline library.
+  3.10. Q. Trouble building Python on Linux.
+  3.11. Q. Other trouble building Python on platform X.
 
  4. Programming in Python
   4.1. Q. Is there a source code level debugger with breakpoints, step,
@@ -109,14 +116,34 @@
   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. 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.10. Q. I try to run a program from the Demo directory but it fails with
+  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.11. Q. What GUI toolkits exist for Python?
-  4.12. Q. Are there any interfaces to commercial database in Python?
-  4.13. Q. Is it possible to write obfuscated one-liners in Python?
+  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 commercial database 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. an't seem to use os.read() on a pipe created with os.popen().
 
  5. Extending Python
   5.1. Q. Can I create my own functions in C?
@@ -125,6 +152,11 @@
   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. What happened to mktuple(), featuring in an example in the
+       Extensions manual?
+  5.8. Q. How do I call an object's method from C?
+  5.9. Q. How do I catch the output from print_error()?
+  5.10. Q. How do I access a module written in Python from C?
 
  6. Python's design
   6.1. Q. Why isn't there a generic copying operation for objects in
@@ -143,6 +175,8 @@
        files)?
   6.9. Q. Why must 'self' be declared and used explicitly in method
        definitions and calls?
+  6.10. 't you emulate threads in the interpreter instead of relying on
+        an OS-specific thread implementation?
 
  7. Using Python on non-UNIX platforms
   7.1. Q. Is there a Mac version of Python?
@@ -150,13 +184,18 @@
   7.3. Q. Is there a Windows version of Python?
   7.4. Q. Is there a Windows NT version of Python?
   7.5. Q. Is there an OS/2 version of Python?
-  7.6. Q. I have the PC version but it appears to be only a binary.
-       Where's the library?
-  7.7. Q. Where's the documentation for the Mac or PC version?
-  7.8. 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)?
+  7.6. Q. Is there a VMS version of Python?
+  7.7. Q. What about IBM mainframes, or other esoteric non-UNIX
+       platforms?
+  7.8. Q. Where are the source or Makefiles for the non-UNIX versions?
+  7.9. Q. What is the status and support for the non-UNIX versions?
+  7.10. Q. I have the PC version but it appears to be only a binary.
+        Where's the library?
+  7.11. Q. Where's the documentation for the Mac or PC version?
+  7.12. 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
@@ -325,19 +364,24 @@
 The University of Virginia uses Python to control a virtual reality
 engine.  Contact: Matt Conway <conway@virginia.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 to use Python in a future product.  The furthest is
-Sunrise Software, who already have a product out using Python -- they
-use Python for a GUI management application and an SNMP network
-manangement application.  Contact: <info@sunrise.com>.
+considering to use Python in a future product.
+
+The furthest is Sunrise Software, who already have a product out using
+Python -- they use Python for a GUI management application and an SNMP
+network manangement application.  Contact: <info@sunrise.com>.
 
 Infoseek is using python to implement their commercial WWW information
 retrieval service.  Contact: <info@infoseek.com>.
 
+Michael Powers of daVinci Time & Space is "writing tons-o-python for
+interactive television entertainment."  Contact: <powers@dvts.com>.
+
 Individuals at many other companies are using Python for
 internal development (witness their contributions to the Python
 mailing list or newsgroup).
@@ -347,6 +391,8 @@
 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
@@ -354,7 +400,15 @@
 (numbered 0.9.x and 1.0.x) have been coming out roughly every 3 to 6
 months for the past four years.
 
-2.5. Q. What new developments are expected for Python in the future?
+2.5. Q. When will the next version be released?
+
+A. I am planning to release 1.1 before October 15.  It will contain
+tons of changes, including (again) improved portability, especially
+better support for DOS, Windows, Windows NT an the Macintosh.  A few
+modules will have been converted to the new naming scheme.  A working
+signal module will be present.
+
+2.6. Q. What new developments are expected for Python in the future?
 
 A.  A proposal is being worked out to change the semantics of operator
 overloading (__add__, __mul__ etc.) to make them more useful for
@@ -368,15 +422,13 @@
 
 There will be better ports to the Mac, DOS, Windows, Windows NT, and
 OS/2.  The Windows ports will support dynamically loaded modules using
-DLLs.  There may be a Windows version of STDWIN (someone has actually
-written one and contributed it but it's not robust enough at the
-moment).
+DLLs.
 
 Also planned is improved support for embedding Python in other
 applications, e.g. by renaming most global symbols to have a "Py"
 prefix and providing more documentation and threading support.
 
-2.6. Q. Is it reasonable to propose incompatible changes to Python?
+2.7. 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
@@ -449,7 +501,62 @@
 instead of -O so this may be an option if you insist on using gcc.  If
 someone tracks it down more completely I'd like to hear about it!
 
-3.8. Q. Other trouble building Python on platform X.
+3.8. 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.9. Q. Trouble building or linking with the GNU readline library.
+
+A. Consider using readline 2.0.  From the Python 1.1 README:
+
+- 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 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:
+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.bugs for specific problems with the
+readline library (I don't get this group here but I've been told
+that it is the place for readline bugs.)
+
+3.10. Q. Trouble building Python on Linux.
+
+A. There shouldn't be any -- I've seen several complaints but more
+reports on successful "out-of-the-box" ports on Linux.  The standard
+configure script runs just fine on Linux.
+
+3.11. Q. Other trouble building Python on platform X.
 
 A. Please email the details to <guido@cwi.nl> and I'll look into it.
 
@@ -493,11 +600,15 @@
 
 4.3. Q. Is there a curses/termcap package for Python?
 
-A. No, but you can use the "alfa" (== character cell) version of
-STDWIN.  (STDWIN == Standard Windows, a portable windowing system
-interface by the same author, URL: ftp://ftp.cwi.nl/pub/stdwin.)
-This will also prepare your program for porting to windowing
-environments such as X11 or the Macintosh.
+A. Yes -- Lance Ellinghouse 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.
+
+You could also consider using the "alfa" (== character cell) version
+of STDWIN.  (STDWIN == Standard Windows, a portable windowing system
+interface by the same author, 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?
 
@@ -609,22 +720,25 @@
 
 	from modname import some_objects
 
-will continue to work with the old version of the objects imported
-thus.
+will continue to work with the old version of the imported objects.
 
-4.9. 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.9. Q. How do I find the current module name?
 
 A. A module can find out its own module name by alooking at the
 (predefined) global variable __name__.  If this has the value
-'__main__' you are running as a script.  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:
+'__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.10. Q. I try to run a program from the Demo directory but it fails with
+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 which hasn't been configured on
@@ -641,17 +755,36 @@
 related modules are still somewhat flakey, so don't try this unless
 you know a bit or two about building X applications on your platform.
 
-4.11. Q. What GUI toolkits exist for Python?
+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 --
+unfortuunately 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.
 
+- There's a neat object-oriented interface to the Tcl/Tk widget set,
+called Tkinter.  You can ftp it from ftp.cwi.nl as
+pub/python/tkinter.tar.gz.  This is probably the easiest to install
+and use, and the most complete widget set.
+
 - The standard Python distribution comes with an interface to STDWIN,
 a platform-independent low-level windowing interface (you have to ftp
 the source for stdwin separately, e.g. from ftp.cwi.nl in pub/stdwin
 or gatekeeper.dec.com in pub/misc/stdwin).  STDWIN runs under X11 or
-the Mac; a Windows port is about to be released.
+the Mac; a Windows port has been attempted but I can't seem to get it
+working.  Note that STDWIN is really not powerful enough to implement
+a modern GUI (no widgets, etc.) and that I don't have the time to
+maintain or extend it, so you may be better off using Tkinter or the
+Motif interface, unless you require portability to the Mac (which is
+also offered by SUIT, by the way -- see below).
 
-- For SGI only, there's an interface to the complete GL (Graphics
+- For SGI IRIX only, there's an interface 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 ftp.cs.ruu.nl in pub/SGI/FORMS).
@@ -668,15 +801,12 @@
 available by Antonio Costa on ftp site asterix.inescn.pt, directory
 pub/PC/python, file pyt102su.exe (a self-extracting archive).
 
-- There's a neat interface to the Tcl/Tk widget set; ftp it from
-ftp.cwi.nl as pub/python/tkinter.tar.gz.
-
 - There's an interface to WAFE, a Tcl interface to the X11 Motif and
 Athena widget sets.  Last I heard about it it was included in the
 WAFE 1.0 prerelease, ftp'able from ftp.wu-wien.ac.at as
 pub/src/X11/wafe/wafe-1.0.tar.gz-prerelease.
 
-4.12. Q. Are there any interfaces to commercial database in Python?
+4.14. Q. Are there any interfaces to commercial database in Python?
 
 A. There's an interface to SYBASE by John Redford
 <jredford@lehman.com>.
@@ -684,7 +814,10 @@
 There's also an interface to metalbase by Lance Ellinghouse
 <lance@markv.com>.
 
-4.13. Q. Is it possible to write obfuscated one-liners in Python?
+Anthony Baxter <anthony.baxter@aaii.oz.au> has written an interface to
+mSQL (mini-SQL).  Ftp it from ftp.cwi.nl:/pub/python/PymSQL.tar.gz.
+
+4.15. Q. Is it possible to write obfuscated one-liners in Python?
 
 A. Yes.  See the following three examples, due to Ulf Bartelt:
 
@@ -712,7 +845,167 @@
 
 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.
+
+Steve Majewski (or was it Tim Peters?) 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 remvoes those
+pointers.  Please don't ever call __del__ directly -- __del__ should
+call close() and close() should make sure that it can be called mor
+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 cleanp function using sys.exitfunc (see question 4.4).
+
+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.
+
+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. I guess the following would be universal for popen
+(untested):
+
+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.values():
+		prefix = prefix + '%s=%s\n' % (key, mkarg(value))
+		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.
+
+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 word 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.
+
+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 automatic;
+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 clas: 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).
 
 5. Extending Python
 ===================
@@ -762,7 +1055,97 @@
 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).
+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. What happened to mktuple(), featuring in an example in the
+Extensions manual?
+
+A. It's a typo, I meant newtupleobject() (see previous question).
+
+5.8. 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.9. 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.
+FWIW, there seems to be a small problem that requires the 'softspace'
+attribute to be defined too (I cant remember exact details of the
+problem).
+
+* redirect sys.stdout and sys.stderr to this object.
+
+* call print_error, or just allow the standard traceback mechansim to
+work.
+
+Then, the output will go whereever your write() method sends it.
+
+5.10. 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.
 
 
 6. Python's design
@@ -787,6 +1170,21 @@
 A. Hmm, hmm.  Basically for the same reasons as why there is no
 generic copying operation.
 
+However, since there is a real desire to have persistent operations,
+I'm thinking of extending the marshal module to support object sharing
+(and hence recursive objects) and to extend the list of supported
+types considerably.  For user-defined classes, hooks with __*__ names
+will allow the class to modify the way their instances are dumped and
+loaded.  Built-in types (including those defined by new extensions)
+may also define dump/load hooks.  There are several problems still to
+solve, e.g. how do you reliably find the class of which an object is
+an instance at load time -- assuming the class itself is loaded from
+some module, and not part of the dumped data.  It is also necessary to
+separate the functionality of converting a set of objects into a byte
+stream from which they can be reloaded, from the ability to save these
+byte streams as files and being able to reference an object by a
+persistent global name.
+
 6.3. Q. Why isn't there a switch or case statement in Python?
 
 A. You can do this easily enough with a sequence of
@@ -917,6 +1315,14 @@
 unqualified names inside a method don't have to search the instance's
 directories.
 
+6.10. 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.
+
 
 7. Using Python on non-UNIX platforms
 =====================================
@@ -938,6 +1344,10 @@
 containing the required DOS extended and 387 emulator.  Both are on
 most ftp sites carrying Python.
 
+The file dosbuild.tar.gz on the standard ftp sites
+(e.g. ftp.cwi.nl:/pub/python/) contains rudimentary Makefiles and
+instructions.
+
 7.3. Q. Is there a Windows version of Python?
 
 A. Yes.  Use qwpython.exe.  The only problem with it: ^C
@@ -945,18 +1355,77 @@
 KeyboardInterrupt.  You can also run 16python.exe or 32python.exe in a
 "DOS box", but qwpython.exe appears to be slightly faster.
 
+There aren't any Makefiles at this moment.  Sorry.
+
+Using Win32s (a free NT compatibility package by Microsoft) you can
+also use the NT version by Mark Hammond -- the Win32s package is also
+in that directory (you'll need several MB of disk space to install
+it).  See the next question.
+
 7.4. Q. Is there a Windows NT version of Python?
 
 A. Yes.  Use ntpython.exe.  This is for Intel CPUs.  If you want a
 Windows user interface, use qwpython.exe.
 
+Mark Hammond <MHammond@cmutual.com.au> is building a better NT port.
+This supports using DLLs for dynamic loading of Python modules, and
+includes an interface to the Microsoft Foundation Classes and a Python
+programming environment using it that's written mostly in Python.  A
+prerelease (source and binaries) can be ftp'ed from
+ftp.cwi.nl:/pub/python/nt/ -- most mirrors will also have this.  A
+thread module is also planned but currently low on Mark's list of
+priorities.
+
 7.5. Q. Is there an OS/2 version of Python?
 
 A. Yes.  You can ftp it (from ftp.cwi.nl in pub/python, or from the
 mirror sites) as pyth_os2.zip.  This contains both an executable and
 Makefiles for those fortunate enough to have a C compiler.
 
-7.6. Q. I have the PC version but it appears to be only a binary.
+7.6. Q. Is there a VMS version of Python?
+
+A. I think not (yet).  This question has been asked on the list
+several times and I've never seen an answer.  Maybe someone with a VMS
+C compiler could attempt a port?  Probably coming up with proper
+Makefiles, config.h and config.c should be sufficient.  If you succeed
+(or even if you get stuck halfway), please let me know!  (Info as of
+23 September 1994.)
+
+7.7. Q. What about IBM mainframes, or other esoteric non-UNIX
+platforms?
+
+A. Basically, the same story as for VMS...  (Info as of 23 September
+1994.)
+
+For ports of Windows NT to non-Intel platforms, the normal NT port
+should work except you may have to use a different Makefile.
+(Unconfirmed suggestions from the Python list.)
+
+7.8. Q. Where are the source or Makefiles for the non-UNIX versions?
+
+A. The standard sources can (almost) be used. See the previous
+questions for availability of Makefiles/projects or patches.  If you
+find things in the standard sources that don't work on your particular
+platform, please let me know and I'll integrate a solution into the
+next release of the standard sources.  If you submit a fix, please use
+some kind of #ifdef so as to keep the source working for other
+platforms.  In particular, if the patch works around the availability
+of a particular function of header file, you should mimic the
+HAVE_... style used by the configure script -- you can then submit a
+config.h file for a particular platform so there are no absolutely
+platform-specific #ifdefs in the rest of the sources.
+
+7.9. 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.
+
+7.10. Q. I have the 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
@@ -979,23 +1448,22 @@
 
 	C> SET PYTHONPATH=C:\misc\python\lib
 
-7.7. Q. Where's the documentation for the Mac or PC version?
+7.11. Q. Where's the documentation for the Mac or PC version?
 
 A. There isn't any.  The documentation for the Unix version also
 applies to the Mac and PC versions.  Where applicable, differences
 are indicated in the text.
 
-7.8. Q. The Mac (PC) version doesn't seem to have any facilities for
+7.12. 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, I am quite happy with the Desk
-Accessory called Sigma Edit; this doesn't require Multifinder or
-System 7.  I work like this: start the interpreter; edit a module file
-using Sigma Edit; import and test it in the interpreter; edit again in
-Sigma Edit; then use the built-in function reload() to re-read the
-imported module; etc.
+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