Need help with Python scoping rules

Steven D'Aprano steve at
Wed Aug 26 17:55:08 CEST 2009

On Wed, 26 Aug 2009 14:09:57 +0000, kj wrote:

>>1. One of the key aspects of Python's design is that attributes must be
>>accessed explicitly with dot notation.  Accessing class scopes from
>>nested functions would (seemingly) allow access to class attributes
>>without the dotted notation.  Therefore it is not allowed.
> It would be trivial to define a keyword (e.g. this, or if you prefer,
> __this__), valid only within a class statement, and that the interpreter
> would recognize as "the current class", even before this class is full
> defined.

Python doesn't treat the addition of new keywords, and the corresponding 
breakage of code which used that word as a normal name, as "trivial" -- 
the Python dev team takes their responsibilities to not casually break 
people's code seriously. That pretty much rules out "this", although it 
would allow "__this__".

However, what's your use-case?

class Demo(object):
    def f(n):
        return n+1
    x = f(10)

is a poorly written class, because the user will expect to do this:

instance = Demo()
assert instance.c == 11  # suceeds
instance.f(10) == 11  # fails

Since the function f doesn't refer to a Demo instance, or the Demo class, 
why do you put it inside the Demo class? It doesn't belong there, it 
belongs in the global (module) scope. Move it out, and your problem goes 

The only use-case I can think of for __this__ is the following:

class Example(object):
    def rec(n):
        if n < 2: return "x"
        return "x" + __this__.rec(n/2)


but again, why include rec() in the class if it doesn't actually have 
anything to do with the class or the instance? Or why make it a 
staticmethod? Just make it a class method:

class Example(object):
    def rec(cls, n):
        if n < 2: return "x"
        return "x" + cls.rec(n/2)


More information about the Python-list mailing list