python-dev Summary for 2005-08-01 through 2005-08-15 [draft]
Here's August Part One. As usual, if anyone can spare the time to proofread this, that would be great! Please send any corrections or suggestions to Steve (steven.bethard at gmail.com) and/or me, rather than cluttering the list. Ta! ============= Announcements ============= ---------------------------- QOTF: Quote of the Fortnight ---------------------------- Some wise words from Donovan Baarda in the PEP 347 discussions: It is true that some well designed/developed software becomes reliable very quickly. However, it still takes heavy use over time to prove that. Contributing thread: - `PEP: Migrating the Python CVS to Subversion <http://mail.python.org/pipermail/python-dev/2005- August/055105.html>`__ [SJB] ------------ Process PEPs ------------ The PEP editors have introduced a new PEP category: "Process", for PEPs that don't fit into the "Standards Track" and "Informational" categories. More detail can be found in `PEP 1`_, which it itself a Process PEP. .. _PEP 1: http://www.python.org/peps/pep-0001.html Contributing thread: - `new PEP type: Process <http://mail.python.org/pipermail/python-dev/2005-August/055361.html>`__ [TAM] ----------------------------------------------- Tentative Schedule for 2.4.2 and 2.5a1 Releases ----------------------------------------------- Python 2.4.2 is tentatively scheduled for a mid-to-late September release, and a first alpha of Python 2.5 for March 2006 (with a final release around May/June). This means that a PEP for the 2.5 release, detailing what will be included, will likely be created soon; at present there are various accepted PEPs that have not yet been implemented. Contributing thread: - `plans for 2.4.2 and 2.5a1 <http://mail.python.org/pipermail/python-dev/2005-August/055342.html>`__ [TAM] ========= Summaries ========= ------------------------------- Moving Python CVS to Subversion ------------------------------- The `PEP 347`_ discussion from last fortnight continued this week, with a revision of the PEP, and a lot more discussion about possible version control software (RCS) for the Python repository, and where the repository should be hosted. Note that this is not a discussion about bug trackers, which will remain with Sourceforge (unless a separate PEP is developed for moving that). Many revision control systems were extensively discussed, including `Subversion`_ (SVN), `Perforce`_, and `Monotone`_. Whichever system is moved to, it should be able to be hosted somewhere (if *.python.org, then it needs to be easily installable), needs to have software available to convert a repository from CVS, and ideally would be open-source; similarity to CVS is also an advantage in that it requires a smaller learning curve for existing developers. While Martin isn't willing to discuss every system there is, he will investigate those that make him curious, and will add other people's submissions to the PEP, where appropriate. The thread included a short discussion about the authentication mechanism that svn.python.org will use; svn+ssh seems to be a clear winner, and a test repository will be setup by Martin next fortnight. The possibility of moving to a distributed revision control system (particularly `Bazaar-NG`_) was also brought up. Many people liked the idea of using a distributed revision control system, but it seems unlikely that Bazaar-NG is mature enough to be used for the main Python repository at the current time (a move to it at a later time is possible, but outside the scope of the PEP). Distributed RCS are meant to reduce the barrier to participation (anyone can create the their own branches, for example); Bazaar-NG is also implemented in Python, which is of some benefit. James Y Knight pointed out `svk`_, which lets developers create their own branches within SVN. In general, the python-dev crowd is in favour of moving to SVN. Initial concern about the demands on the volunteer admins should the repository be hosted at svn.python.org were addressed by Barry Warsaw, who believes that the load will be easily managed with the existing volunteers. Various alternative hosts were discussed, and if detailed reports about any of them are created, these can be added to the PEP. While the fate of all PEPS lie with the BDFL (Guido), it is likely that the preferences of those that frequently check in changes, the pydotorg admins, and the release managers (who have all given favourable reports so far), will have a significant effect on the pronouncement of this PEP. .. _PEP 347: http://www.python.org/peps/pep-0347.html .. _svk: http://svk.elixus.org/ .. _Perforce: http://www.perforce.com/ .. _Subversion: http://subversion.tigris.org/ .. _Monotone: http://venge.net/monotone/ .. _Bazaar-NG: http://www.bazaar-ng.org/ Contributing threads: - `PEP: Migrating the Python CVS to Subversion <http://mail.python.org/pipermail/python-dev/2005- August/055064.html>`__ - `PEP 347: Migration to Subversion <http://mail.python.org/pipermail/python-dev/2005- August/055211.html>`__ - `Hosting svn.python.org <http://mail.python.org/pipermail/python-dev/2005-August/055360.html>`__ - `Fwd: Distributed RCS <http://mail.python.org/pipermail/python-dev/2005-August/055372.html>`__ - `cvs to bzr? <http://mail.python.org/pipermail/python-dev/2005-August/055373.html>`__ - `Distributed RCS <http://mail.python.org/pipermail/python-dev/2005-August/055377.html>`__ - `Fwd: PEP: Migrating the Python CVS to Subversion <http://mail.python.org/pipermail/python-dev/2005 -August/055388.html>`__ - `On distributed vs centralised SCM for Python <http://mail.python.org/pipermail/python-dev/2005- August/055432.html>`__ [TAM] ------------------------------------------ PEP 348: Exception Hierarchy in Python 3.0 ------------------------------------------ This fortnight mostly concluded the previous discussion about `PEP 348`_, which sets out a roadmap for changes to the exception hierarchy in Python 3.0. The proposal was heavily scaled back to retain most of the current exception hierarchy unchanged. A new exception, BaseException, will be introduced above Exception in the current hierarchy, and KeyboardInterrupt and SystemExit will become siblings of Exception. The goal here is that:: except Exception: will now do the right thing for most cases, that is, it will catch all the exceptions that you can generally recover from. The PEP would also move NotImplementedError out from under RuntimeError, and alter the semantics of the bare except so that:: except: is the equivalent of:: except Exception: Only BaseException will appear in Python 2.5. The remaining modifications will not occur until Python 3.0. .. _PEP 348: http://www.python.org/peps/pep-0348.html Contributing threads: - `Pre-PEP: Exception Reorganization for Python 3.0 <http://mail.python.org/pipermail/python-dev/2005 -August/055063.html>`__ - `PEP, take 2: Exception Reorganization for Python 3.0 <http://mail.python.org/pipermail/python- dev/2005-August/055103.html>`__ - `Exception Reorg PEP checked in <http://mail.python.org/pipermail/python-dev/2005- August/055138.html>`__ - `PEP 348: Exception Reorganization for Python 3.0 <http://mail.python.org/pipermail/python-dev/2005 -August/055162.html>`__ - `Major revision of PEP 348 committed <http://mail.python.org/pipermail/python-dev/2005- August/055199.html>`__ - `Exception Reorg PEP revised yet again <http://mail.python.org/pipermail/python-dev/2005- August/055292.html>`__ - `PEP 348 and ControlFlow <http://mail.python.org/pipermail/python-dev/2005-August/055310.html>`__ - `PEP 348 (exception reorg) revised again <http://mail.python.org/pipermail/python-dev/2005- August/055412.html>`__ [SJB] ---------------------- Moving towards Unicode ---------------------- Neil Schemenauer presented `PEP 349`_, which tries to ease the transition to Python 3.0, in which there will be a bytes() type for byte data and a str() type for text data. Currently to convert an object to text, you have one of three options: * Call str(). This breaks with a UnicodeEncodeError if the object is of type unicode (or a subtype) or can only represent itself in unicode and therefore returns unicode from __str__. * Call unicode(). This can break external code that is not yet Unicode-safe and that passed a str object to your code but got a unicode object back. * Use the "%s" format specifier. This breaks with a UnicodeEncodeError if the object can only represent itself in unicode and therefore returns unicode from __str__. `PEP 349`_ attempts to address this problem by introducing a text() builtin which returns str or unicode instances unmodified, and returns the result of calling __str__() on the object otherwise. Guido preferred to instead relax the restrictions on str() to allow it to return unicode objects. Neil implemented such a patch, and found that it broke only two test cases. The discussion stopped shortly after Neil's report however, so it was unclear if any permanent changes had been agreed upon. Guido made a few other Python 3.0 suggestions in this thread: * The bytes() type should be mutable with a corresponding frozenbytes() immutable type * Opening a file in binary or text mode would cause it to return bytes() or str() objects, respectively * The file type should grow a getpos()/setpos() pair that are identical to tell()/seek() when a file is open in binary mode, and which work like tell()/seek() but on characters instead of bytes when a file is open in text mode However, none of these seemed to be solid commitments. .. _PEP 349: http://www.python.org/peps/pep-0349.html Contributing threads: - `PEP: Generalised String Coercion <http://mail.python.org/pipermail/python-dev/2005- August/055186.html>`__ - `Generalised String Coercion <http://mail.python.org/pipermail/python-dev/2005- August/055194.html>`__ [SJB] ---------------------------- PEP 344 and reference cycles ---------------------------- Armin Rigo brought up an issue with `PEP 344`_ which proposes, among other things, adding a __traceback__ attribute to exceptions to avoid the hassle of extracting it from sys.exc_info(). Armin pointed out that if exceptions grow a __traceback__ attribute, every statement:: except Exception, e: will create a cycle:: e.__traceback__.tb_frame.f_locals['e'] Despite the fact that Python has cyclic garbage collection, there are still some situations where cycles like this can cause problems. Armin showed an example of such a case:: class X: def __del__(self): try: typo except Exception, e: e_type, e_value, e_tb = sys.exc_info() Even in current Python, instances of the X class are uncollectible. When garbage collection runs and tries to collect an X object, it calls the __del__() method. This creates the cycle:: e_tb.tb_frame.f_locals['e_tb'] The X object itself is available through this cycle (in ``f_locals['self']``), so the X object's refcount does not drop to 0 when __del__() returns, so it cannot be collected. The next time garbage collection runs, it finds that the X object has not been collected, calls its __del__() method again and repeats the process. Tim Peters suggested this problem could be solved by declaring that __del__() methods are called exactly once. This allows the above X object to be collected because on the second run of the garbage collection, __del__() is not called again. Thus, the refcount of the X object is not incremented, and so it is collected by garbage collection. However, guaranteeing that __del__() is called only once means keeping track somehow of which objects' __del__() methods were called, which seemed somewhat unattractive. There was also brief talk about removing __del__ in favor of weakrefs, but those waters seemed about as murky as the garbage collection ones. .. _PEP 344: http://www.python.org/peps/pep-0344.html Contributing thread: - `__traceback__ and reference cycles <http://mail.python.org/pipermail/python-dev/2005- August/055251.html>`__ [SJB] ---------------------------- Style for raising exceptions ---------------------------- Guido explained that these days exceptions should always be raised as:: raise SomeException("some argument") instead of:: raise SomeException, "some argument" The second will go away in Python 3.0, and is only present now for backwards compatibility. (It was necessary when strings could be exceptions, in order to pass both the exception "type" and message.) PEPs 8_ and 3000_ were accordingly updated. .. _8: http://www.python.org/peps/pep-0008.html .. _3000: http://www.python.org/peps/pep-3000.html Contributing threads: - `PEP 8: exception style <http://mail.python.org/pipermail/python-dev/2005-August/055187.html>`__ - `FW: PEP 8: exception style <http://mail.python.org/pipermail/python-dev/2005-August/055191.html>`__ [SJB] ----------------------------------- Skipping list comprehensions in pdb ----------------------------------- When using pdb, the only way to skip to the end of a loop is to set a breakpoint on the line after the loop. Ilya Sandler suggested adding an optimal numeric argument to pdb's "next" comment to indicate how many lines of code should be skipped. Martin v. Löwis pointed out that this differs from gdb's "next <n>" command, which does "next" n times. Ilya suggested implementing gdb's "until" command instead, which gained Martin's approval. It was also pointed out that pdb is one of the less Pythonic modules, particularly in terms of the ability to subclass/extend, and would be a good candidate for rewriting, if anyone had the inclination and time. Contributing threads: - `pdb: should next command be extended? <http://mail.python.org/pipermail/python-dev/2005- August/055218.html>`__ - `an alternative suggestion, Re: pdb: should next command be extended? <http://mail.python.org/pipermail/python-dev/2005-August/055286.html>`__ [TAM] ------------------ Sets in Python 2.5 ------------------ Raymond Hettinger has been checking-in the new implementation for sets in Python 2.5. The implementation is based heavily on dictobject.c, the code for Python dict() objects, and generally deviates only when there is an obvious gain in doing so. Raymond posted his new API for discussion, but there didn't appear to be any comments. Contributing threads: - `[Python-checkins] python/dist/src/Objects setobject.c, 1.45, 1.46 <http://mail.python.org/pipermail/python-dev/2005-August/055337.html>`__ - `Discussion draft: Proposed Py2.5 C API for set and frozenset objects <http://mail.python.org/pipermail/python-dev/2005-August/055365.html>`__ [SJB] ================================ Deferred Threads (for next time) ================================ - `SWIG and rlcompleter <http://mail.python.org/pipermail/python-dev/2005-August/055413.html>`__ =============== Skipped Threads =============== - `Extension of struct to handle non byte aligned values? <http://mail.python.org/pipermail/python- dev/2005-August/055062.html>`__ - `Syscall Proxying in Python <http://mail.python.org/pipermail/python-dev/2005-August/055069.html>`__ - `__autoinit__ (Was: Proposal: reducing self.x=x; self.y=y; self.z=z boilerplate code) <http://mail.python.org/pipermail/python-dev/2005-August/055093.html>`__ - `Weekly Python Patch/Bug Summary <http://mail.python.org/pipermail/python-dev/2005- August/055110.html>`__ - `PEP 342 Implementation <http://mail.python.org/pipermail/python-dev/2005-August/055151.html>`__ - `String exceptions in Python source <http://mail.python.org/pipermail/python-dev/2005- August/055155.html>`__ - `[ python-Patches-790710 ] breakpoint command lists in pdb <http://mail.python.org/pipermail/python -dev/2005-August/055157.html>`__ - `[C++-sig] GCC version compatibility <http://mail.python.org/pipermail/python-dev/2005- August/055219.html>`__ - `PyTuple_Pack added references undocumented <http://mail.python.org/pipermail/python-dev/2005- August/055232.html>`__ - `PEP-- Context Managment variant <http://mail.python.org/pipermail/python-dev/2005- August/055271.html>`__ - `Sourceforge CVS down? <http://mail.python.org/pipermail/python-dev/2005-August/055307.html>`__ - `PSF grant / contacts <http://mail.python.org/pipermail/python-dev/2005-August/055311.html>`__ - `Python + Ping <http://mail.python.org/pipermail/python-dev/2005-August/055319.html>`__ - `Terminology for PEP 343 <http://mail.python.org/pipermail/python-dev/2005-August/055347.html>`__ - `dev listinfo page (was: Re: Python + Ping) <http://mail.python.org/pipermail/python-dev/2005- August/055348.html>`__ - `set.remove feature/bug <http://mail.python.org/pipermail/python-dev/2005-August/055352.html>`__ - `Extension to dl module to allow passing strings from native function <http://mail.python.org/pipermail/python-dev/2005-August/055363.html>`__ - `build problems on macosx (CVS HEAD) <http://mail.python.org/pipermail/python-dev/2005- August/055385.html>`__ - `request for code review - hashlib - patch #1121611 <http://mail.python.org/pipermail/python- dev/2005-August/055410.html>`__ - `python-dev Summary for 2005-07-16 through 2005-07-31 [draft] <http://mail.python.org/pipermail/python-dev/2005-August/055411.html>`__ - `string_join overrides TypeError exception thrown in generator <http://mail.python.org/pipermail/python-dev/2005-August/055414.html>`__ - `implementation of copy standard lib <http://mail.python.org/pipermail/python-dev/2005- August/055450.html>`__ - `xml.parsers.expat no userdata in callback functions <http://mail.python.org/pipermail/python- dev/2005-August/055362.html>`__
I must have missed this one:
---------------------------- Style for raising exceptions ----------------------------
Guido explained that these days exceptions should always be raised as::
raise SomeException("some argument")
instead of::
raise SomeException, "some argument"
The second will go away in Python 3.0, and is only present now for backwards compatibility. (It was necessary when strings could be exceptions, in order to pass both the exception "type" and message.) PEPs 8_ and 3000_ were accordingly updated.
AFAIR, the second form was also meant to be able to defer the instantiation of the exception class until really needed in order to reduce the overhead related to raising exceptions in Python. However, that optimization never made it into the implementation, I guess.
.. _8: http://www.python.org/peps/pep-0008.html .. _3000: http://www.python.org/peps/pep-3000.html
Contributing threads:
- `PEP 8: exception style <http://mail.python.org/pipermail/python-dev/2005-August/055187.html>`__ - `FW: PEP 8: exception style <http://mail.python.org/pipermail/python-dev/2005-August/055191.html>`__
-- Marc-Andre Lemburg eGenix.com Professional Python Services directly from the Source (#1, Aug 25 2005)
Python/Zope Consulting and Support ... http://www.egenix.com/ mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/ mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/
::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,FreeBSD for free ! ::::
On 8/25/05, M.-A. Lemburg <mal@egenix.com> wrote:
I must have missed this one:
---------------------------- Style for raising exceptions ----------------------------
Guido explained that these days exceptions should always be raised as::
raise SomeException("some argument")
instead of::
raise SomeException, "some argument"
The second will go away in Python 3.0, and is only present now for backwards compatibility. (It was necessary when strings could be exceptions, in order to pass both the exception "type" and message.) PEPs 8_ and 3000_ were accordingly updated.
AFAIR, the second form was also meant to be able to defer the instantiation of the exception class until really needed in order to reduce the overhead related to raising exceptions in Python.
However, that optimization never made it into the implementation, I guess.
Something equivalent is used internally in the C code, but that doesn't mean we'll need it in Python code. The optimization only works if the exception is also *caught* in C code, BTW (it is instantiated as soon as it is handled by a Python except clause). Originally, the second syntax was the only available syntax, because all we had were string exceptions. Now that string exceptions are dead (although not yet buried :) I really don't see why we need to keep both versions of the syntax; Python 3.0 will only have one version. (We're still debating what to do with the traceback argument; wanna revive PEP 344?) If you need to raise exceptions fast, pre-instantiate an instance. -- --Guido van Rossum (home page: http://www.python.org/~guido/)
Guido van Rossum wrote:
On 8/25/05, M.-A. Lemburg <mal@egenix.com> wrote:
I must have missed this one:
---------------------------- Style for raising exceptions ----------------------------
Guido explained that these days exceptions should always be raised as::
raise SomeException("some argument")
instead of::
raise SomeException, "some argument"
The second will go away in Python 3.0, and is only present now for backwards compatibility. (It was necessary when strings could be exceptions, in order to pass both the exception "type" and message.) PEPs 8_ and 3000_ were accordingly updated.
AFAIR, the second form was also meant to be able to defer the instantiation of the exception class until really needed in order to reduce the overhead related to raising exceptions in Python.
However, that optimization never made it into the implementation, I guess.
Something equivalent is used internally in the C code, but that doesn't mean we'll need it in Python code. The optimization only works if the exception is also *caught* in C code, BTW (it is instantiated as soon as it is handled by a Python except clause).
Ah, I knew it was in there somewhere (just couldn't find yesterday when I was looking for the optimization :-).
Originally, the second syntax was the only available syntax, because all we had were string exceptions. Now that string exceptions are dead (although not yet buried :) I really don't see why we need to keep both versions of the syntax; Python 3.0 will only have one version.
Actually, we do only have one version: the first syntax is just a special case of the second (with the value argument set to None). I don't see a need for two or more syntaxes either, but most code nowadays uses the second variant (I don't know of any code that uses the traceback argument), which puts up a high barrier for changes. This is from a comment in ceval.c: /* We support the following forms of raise: raise <class>, <classinstance> raise <class>, <argument tuple> raise <class>, None raise <class>, <argument> raise <classinstance>, None raise <string>, <object> raise <string>, None An omitted second argument is the same as None. In addition, raise <tuple>, <anything> is the same as raising the tuple's first item (and it better have one!); this rule is applied recursively. Finally, an optional third argument can be supplied, which gives the traceback to be substituted (useful when re-raising an exception after examining it). */ That's quite a list of combinations that will all break in Python 3.0 if we only allow "raise <classinstance>". I guess the reason for most code using the variante "raise <class>, <argument tuple>" is that it simply looks a lot like the corresponding "except <class>, errorobj" clause.
(We're still debating what to do with the traceback argument; wanna revive PEP 344?)
If you need to raise exceptions fast, pre-instantiate an instance.
Ideally, I'd like Python to take care of such optimizations rather than having to explicitly code for them: If I write "raise ValueError, 'bad format'" and then catch the error with just "except ValueError", there would be no need for Python to actually instantiate the exception object. OTOH, lazy instantiation may have unwanted side-effects (just like any lazy evaluation), e.g. the instantiation could result in another exception to get raised. Can't have 'em all, I guess. -- Marc-Andre Lemburg eGenix.com Professional Python Services directly from the Source (#1, Aug 26 2005)
Python/Zope Consulting and Support ... http://www.egenix.com/ mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/ mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/
::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,FreeBSD for free ! ::::
MAL> I don't see a need for two or more syntaxes either, but most code MAL> nowadays uses the second variant (I don't know of any code that MAL> uses the traceback argument), which puts up a high barrier for MAL> changes. Earlier this week I managed to fix all the instances in the projects I'm involved with at my day job in a couple rounds of grep/emacs macro sessions. It took all of about 20 minutes, so I don't think the conversion will be onerous. Skip
MAL> I must have missed this one: That's because it was brief and to the point, so the discussion lasted for maybe three messages. Also, someone told us you were on holiday so we thought we could squeak it through without you noticing. Darn those Aussies. Late on the pydev summary again! <wink> >> ---------------------------- >> Style for raising exceptions >> ---------------------------- >> >> Guido explained that these days exceptions should always be raised as:: >> >> raise SomeException("some argument") >> >> instead of:: >> >> raise SomeException, "some argument" >> >> The second will go away in Python 3.0, and is only present now for >> backwards compatibility. (It was necessary when strings could be >> exceptions, in order to pass both the exception "type" and message.) >> PEPs 8_ and 3000_ were accordingly updated. I do have a followup question on the style thing. (I'll leave others to answer MAL's question about optimization.) If I want to raise an exception without an argument, which of the following is the proper form? raise ValueError raise ValueError() Skip
On 8/25/05, skip@pobox.com <skip@pobox.com> wrote:
I do have a followup question on the style thing. (I'll leave others to answer MAL's question about optimization.) If I want to raise an exception without an argument, which of the following is the proper form?
raise ValueError raise ValueError()
The latter. -- --Guido van Rossum (home page: http://www.python.org/~guido/)
participants (4)
-
Guido van Rossum
-
M.-A. Lemburg
-
skip@pobox.com
-
Tony Meyer