Static method

Bruno Desthuilliers bruno.42.desthuilliers at websiteburo.invalid
Thu Feb 18 15:23:27 CET 2010


mk a écrit :
> Bruno Desthuilliers wrote:
> 
>>>>
>>>>
>>>> class Foo4(object):
>>>>     """ working solution 2 : use a lambda """
>>>>     @staticmethod
>>>>     def bar(baaz):
>>>>         print baaz
>>>>
>>>>     tagada = {'bar': lambda x : Foo4.bar(x)}
>>>>
>>>>     def test(self, baaz):
>>>>         self.tagada['bar'](baaz)
>>>
>>> Huh? How does this one work? After all, while in Foo4 body, the Foo4 
>>> does not exist yet? Does lambda defer evaluation to runtime (when 
>>> it's executed) or smth?
>>
>> or smth, yes !-)
>>
>> A lambda expression evals to an ordinary function - just like a def 
>> statement - so Foo4 is not resolved until Foo4.tagada['bar'] is 
>> actually called.
> 
> This works, but... Foo4.bar in tagada is a staticmethod. So what's 
> needed is Foo4.bar.__get__(x)  (not that I'm that smart, I just got 
> 'staticmethod is not callable' exception).

Huh ???

class Foo4(object):

     @staticmethod
     def bar(baaz):
         print baaz

     tagada = {'bar': lambda x : Foo4.bar(x)}

     def test(self, baaz):
         self.tagada['bar'](baaz)

 >>> f = Foo4()
 >>> f.test(42)
42
 >>> Foo4.bar(42)
42
 >>>

WorksForMe(tm).



> It appears I have to use __get__ anyway while referring to bar in Foo4 
> methods:
 >
> def testrefer(self, val):
>     self.bar.__get__(val)
>     Foo4.bar.__get__(val)
> 
> At least I have to do this in my own code:
> 
>     def testit(self, fname):
>         self.print_internal_date.__get__(fname + 'c')
>         PYFileInfo.print_internal_date.__get__(fname + 'c')
> 
> 
> Or else I get "TypeError: 'staticmethod' object is not callable".

I think you broke something somewhere. Assuming you're using Python 2.x 
(>= 2.3 IIRC), my above code works.



More information about the Python-list mailing list