Re: Monkeypatching a staticmethod?

2014-01-10 Thread Piet van Oostrum
Ian Kelly  writes:

> I suggest defining x as a normal function and writing the assignment
> as "Foo.x = staticmethod(x)" to keep x callable from the global
> namespace.  Or just del it after doing the monkey patch.

You can use Foo.x = staticmethod(lambda: 2)
-- 
Piet van Oostrum 
WWW: http://pietvanoostrum.com/
PGP key: [8DAE142BE17999C4]
-- 
https://mail.python.org/mailman/listinfo/python-list


Re: Monkeypatching a staticmethod?

2014-01-09 Thread Ian Kelly
On Thu, Jan 9, 2014 at 10:23 PM, Roy Smith  wrote:
> This is kind of surprising.  I'm running Python 2.7.1.  I've got a class
> with a staticmethod that I want to monkeypatch with a lambda:
>
> --
> class Foo:
> @staticmethod
> def x():
> return 1
>
> Foo.x = lambda: 2
> print Foo.x()
> --
>
> What's weird is that it seems to remember that x is a staticmethod
> despite having been patched:
>
> Traceback (most recent call last):
>   File "static.py", line 8, in 
> Foo.x()
> TypeError: unbound method () must be called with Foo instance as
> first argument (got nothing instead)

No, if it were still a staticmethod then the call would work without
error.  That error is the same that you would get in Python 2 if you
defined the function directly in the class without the staticmethod
decorator.  (In Python 3 the call succeeds as long as it's made from
the class and not from an instance).

> What seems to work is to patch it with another staticmethod:
>
> --
> class Foo:
> @staticmethod
> def x():
> return 1
>
> @staticmethod
> def x():
> return 2
>
> Foo.x = x
> print Foo.x()
> --
>
> $ python static.py
> 2
>
> I didn't even know you could define a staticmethod outside of a class!

I suggest defining x as a normal function and writing the assignment
as "Foo.x = staticmethod(x)" to keep x callable from the global
namespace.  Or just del it after doing the monkey patch.
-- 
https://mail.python.org/mailman/listinfo/python-list