Can I find the class of a method in a decorator.

Ian Kelly ian.g.kelly at gmail.com
Sat Mar 5 20:07:02 EST 2016


On Sat, Mar 5, 2016 at 9:21 AM, Antoon Pardon
<antoon.pardon at rece.vub.ac.be> wrote:
> Op 05-03-16 om 16:18 schreef Chris Angelico:
>> On Sun, Mar 6, 2016 at 2:05 AM, Antoon Pardon
>> <antoon.pardon at rece.vub.ac.be> wrote:
>>> Using python 3.4/3.5
>>>
>>> Suppose I have the following class:
>>>
>>> class Tryout:
>>>
>>>     @extern
>>>     def method(self, ...)
>>>
>>> Now how can I have access to the Tryout class in
>>> the extern function when it is called with method
>>> as argument
>>>
>>> def extern(f):
>>>     the_class = ????
>>>
>>> f.__class doesn't work, if I write the following
>>>
>>> def extern(f)
>>>     print(f.__class__)
>>>
>>> the result is: <class 'function'>, so that doesn't work.
>>> Looking around I didn't find an other obvious candidate
>>> to try. Anybody an idea?
>>
>> At the time when the function decorator is run, there isn't any class.
>> You could just as effectively create your function outside the class
>> and then inject it (Tryout.method = method).
>>
>> What is it you're trying to do? Would it be a problem to have a class
>> decorator instead/as well?
>>
>> ChrisA
>>
>
> The idea is that some of these methods will be externally available
> and others are not. So that I get an external string and can do
> something of the following:
>
> tryout = Tryout()
>
> st = read_next_cmd()
>
> if st in tryout.allowed:
>     getattr(tryout, st)()
> else:
>     raise ValueError("%s: unallowed cmd string" % st)
>
> And the way I wanted to populate Tryout.allowed as a class attribute
> would have been with the decorator extern, which would just have put
> the name of the method in the Tryout.allowed set and then return the function.

If you only needed the function decorator to access the class when the
method is called, then you could have the function decorator return a
custom descriptor. It sounds like you want this to happen before the
method is called, though.

You could have the function decorator simply set an attribute on the
function and return it. Then use a class decorator or a metaclass to
scan all the class's methods when it's constructed in order to
populate the allowed attribute.

Alternatively you could have the function decorator add the allowed
attribute as a boolean on the method rather than on the class and just
check getattr(type(tryout), st).allowed (with the appropriate
try-except).



More information about the Python-list mailing list