Need help with Python scoping rules

Jan Kaliszewski zuo at
Wed Aug 26 02:34:11 CEST 2009

25-08-2009 o 22:16:24 Stephen Hansen <apt.shansen at> wrote:

> The OP's probably is that during the execution of the class body, the  
> class
> doesn't exist... so the 'def fact' -can't- use Classname.fact to address
> itself explicitly, and within fact the locals don't contain a reference  
> to
> the function itself, and its globals don't either. You just can't do  
> that.
> The right way, IMHO, is to move 'fact' up and out of the class into a  
> _fact global variable. Alternatively, you can use a metaclass.

Note that you can also pass a function to the function itself, and then
it works:

>>> class Foo:
...     def func(foo=None):
...         if foo:
...             return foo()
...         else:
...             return '2nd step'
...     x = func(func)
>>> Foo.x
'2nd step'

Note that when called from class definition body, func is an ordinary
function, not a method. It become a method *when it's called as a method*
(what is possible *after* creating the class => outside the definition).


Jan Kaliszewski (zuo) <zuo at>

More information about the Python-list mailing list