Need help with Python scoping rules

Dave Angel davea at ieee.org
Wed Aug 26 10:31:31 EDT 2009


7stud wrote:
> On Aug 25, 7:26 pm, Dave Angel <da... at ieee.org> wrote:
>   
>> Stephen Fairchild wrote:
>>     
>>> You are trying to run code in a class that does not exist yet.
>>>       
>>> def Demo():
>>>     def fact(n):
>>>         if n < 2:
>>>             return 1
>>>         else:
>>>             return n * fact(n - 1)
>>>     return type("Demo", (object,), {"fact": staticmethod(fact), "_classvar":
>>> fact(5)})
>>> Demo =emo()
>>>       
>>> d =emo()
>>> print d._classvar    # prints 120
>>> print d.fact(7)      # prints 5040
>>> print Demo           # prints <class '__main__.Demo'>
>>>       
>>
>> In all these messages, something I haven't seen pointed out is that
>> fact() has no self argument.  
>>
>>     
>
> An "argument" is something that is specified in the the function
> call.  I assume you are trying to state something like, "fact() is not
> defined with a parameter variable named self".  However, that has
> never been a requirement in python:
>
>
> class A(object):
>
>     def fact(n):
>         print n
>
>     fact("hello")
>
>
> a =()
> a.fact()
>
> --output:--
> hello
> <__main__.A object at 0x7faf0>
>
>
>
>   
You're good at nitpicking.  I concede the distinction between argument 
and formal parameter.   And self is a convention, not a requirement.   
But the fact is that the method as written would never have worked, when 
called from outside the class, since you'd have to call it with either 
the class name or an instance, and in either case, the method was then 
trying to do arithmetic on one of those.

Thanks for diluting my point.  The OP is chasing the wrong problem.  Who 
cares whether a class initializer can call a method, if the method 
doesn't meet its original requirements, to be callable outside the class?

And the arguments about how recursion is restricted are ridiculous.  
Nothing wrong with a method calling itself, once it's got a proper 
signature.  You just have to make the call agree with the signature.  
The problem is only that the method may not be actually called until the 
class definition is complete.

DaveA




More information about the Python-list mailing list