Bugs item #1597824, was opened at 2006-11-16 16:23
Message generated for change (Tracker Item Submitted) made by Item Submitter
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1597824&group_id=5470

Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: Python Library
Group: Python 2.5
Status: Open
Resolution: None
Priority: 5
Private: No
Submitted By: Pierre Rouleau (pierre_rouleau)
Assigned to: Nobody/Anonymous (nobody)
Summary: atexit.register does not return the registered function. 

Initial Comment:
Since that the decorator syntax is upon us, I think it would be good if 
atexit.register() was returning the function passed as argument.  This simple 
change to the library would solve a problem with the use of atexit.register as 
a decorator (and I can't think of any use case where this change would break 
any code).

I describe the problem in the following text::


Problem using atexit.register as a decorator
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

In his April 2005 article titled `Python 2.4
Decorators: Reducing code duplication and consolidating
knowledge`_ , Phillip Eby describes how you can use
`atexit.register()`_ from the standard Python library.
He shows how to use the decorator syntax to register a
function that will execute at program termination. Here
is how it goes::

  @atexit.register
  def goodbye(): 
      print "Goodbye, terminating..."


However, there is one fundamental problem with this:
atexit.register() returns None. Since the above code
corresponds to::


  def goodbye(): 
      print "Goodbye, terminating..."
  goodbye = atexit.register(goodbye)

the code registers goodbye but right after it binds
goodbye to None! You can see this in the following
session::

    >>> import atexit
    >>> @atexit.register
    ... def goodbye():
    ...   print "Goodbye, terminating..."
    ... 
    >>> goodbye()
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: 'NoneType' object is not callable
    >>> 
    >>> goodbye
    >>> type(goodbye)
    <type 'NoneType'>
    >>> 

There is two solutions to this problem:

  1. Use another function to register and decorate.
  2. Change atexit.register() in the Python library
     so that it returns the function it registers.

Solution 1 can be implemented right away::

  def atexit_register(fct):
      atexit.register(fct)
      return fct

  @atexit_register
  def goodbye2(): 
      print "Goodbye 2!!"

and it works: it registers the function for execution
at termination but leaves goodbye2 callable::

  >>> def atexit_register(fct):
  ...   atexit.register(fct)
  ...   return fct
  ... 
  >>> @atexit_register
  ... def goodbye2():
  ...   print "Goodbye 2!!"
  ... 
  >>> goodbye2()
  Goodbye 2!!
  >>> goodbye2
  <function goodbye2 at 0x009DD930>
  >>> 

.. References

.. _atexit.register():               
http://www.python.org/doc/current/lib/module-atexit.html
.. _Python 2.4 Decorators\: Reducing code duplication and consolidating 
knowledge:  http://www.ddj.com/184406073


----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1597824&group_id=5470
_______________________________________________
Python-bugs-list mailing list 
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to