monkey patching with @classmethod

gentlestone tibor.beck at hotmail.com
Wed Mar 3 07:11:30 EST 2010


On 3. Mar., 12:57 h., gentlestone <tibor.b... at hotmail.com> wrote:
> Hi, is there some well-known problems with class method monkey
> patching?
>
> I've got this error message:
>
> unbound method get_pocet_neocislovanych() must be called with Pozemok
> instance as first argument (got Subjekt instance instead)
>
> The method is declared as:
> @classmethod
> @monkeypatch(Dokument)
> def get_pocet_neocislovanych(cls, subjekt):
>     return cls.objects.filter(subjekt = subjekt, cislo__isnull =
> True).count() # or pass, this line is not important
>
> and the monkey patch decorator is declared as:
> def monkeypatch(cls):
>     def decorator(func):
>         setattr(cls, func.__name__, func)
>         return func
>     return decorator
>
> If I move the method to class declaration (whitout monkey patching),
> everything is ok, but only if I've restarted the server.

for complexity, there is a code I call the method:

def _application_menu(request, subjekt, aplikacia_url_name):
    return render_to_response('subjekty/aplikacia.html', {
        'subjekt' : subjekt,
        'aplikacia_url_name' : aplikacia_url_name,
        'aplikacia_dictionary' :
aplikacia_dictionary(aplikacia_url_name),
        'listy' : [
            (dokument_url_name, dict(
                get_verbose_name_plural =
dokument.get_verbose_name_plural(),
                get_pocet_neocislovanych =
dokument.get_pocet_neocislovanych(subjekt),
                get_pocet_celkom = dokument.get_pocet_celkom(subjekt),
            )) for dokument_url_name, dokument in
aplikacia_dictionary(aplikacia_url_name)['listy']
        ],
    }, context_instance = RequestContext(request))


unfortunately, sometimes it works, sometimes not, I cannot imagine the
reason, why and when it works and not - even whitout monkey patching

seems like some black magic



More information about the Python-list mailing list