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