Recursive method in class

Terry Reedy tjreedy at udel.edu
Tue Oct 1 07:45:44 EDT 2019


On 10/1/2019 3:37 AM, ast wrote:

> The following code is working well and I don't really understand why
> 
> def factorial(self, n):
>      if not n:
>          return 1
>      else:
>          return n * factorial(self, n - 1)

This creates a function that looks up 'factorial' in the global (module) 
scope when called.

> Dummy = type("DummyObject", (object, ), {"factorial" : factorial})

This creates a reference to the function in the class dict.  There is 
now one function object with 2 references.

> instance = Dummy()
> instance.factorial(3)

instance.factorial still looks up 'factorial' in the global scope, and 
finds it there.  If you delete the global reference after creating the 
class, the lookup will fail, as when


> 
> 6  # correct

> The problem is that "factorial" in line
> "return n * factorial(self, n - 1)" should not have been found
> because there is no factorial function defined in the current
> scope.

Yes there is.  the 'current' scope always includes globals, and globals 
has a reference to the function.


-- 
Terry Jan Reedy





More information about the Python-list mailing list