
tjreedy at udel
Jun 30, 2009, 12:32 PM
Post #5 of 9
(338 views)
Permalink
|
|
Re: Determining if a function is a method of a class within a decorator
[In reply to]
|
|
I do not like top posting. Some thoughts in randon order: Introspection is version-specific. Call-time introspection is different from definition-time introspection. Do what is easy and works. Do not use recipes that depend on version-specific stuff you do not understand. Code objects, I believe, know the names of parameters. That question and responses were only about methods, not non-class functions. You get to match these responses to your post ;-). Terry David Hirschfield wrote: > Yeah, it definitely seems like having two separate decorators is the > solution. But the strange thing is that I found this snippet after some > deep googling, that seems to do something *like* what I want, though I > don't understand the descriptor stuff nearly well enough to get what's > happening: > > http://stackoverflow.com/questions/306130/python-decorator-makes-function-forget-that-it-belongs-to-a-class > > > answer number 3, by ianb. It seems to indicate there's a way to > introspect and determine the class that the function is going to be > bound to...but I don't get it, and I'm not sure it's applicable to my case. > > I'd love an explanation of what is going on in that setup, and if it > isn't usable for my situation, why not? > Thanks again, > -David > > Terry Reedy wrote: >> David Hirschfield wrote: >>> I'm having a little problem with some python metaprogramming. I want >>> to have a decorator which I can use either with functions or methods >>> of classes, which will allow me to swap one function or method for >>> another. It works as I want it to, except that I want to be able to >>> do some things a little differently depending on whether I'm swapping >>> two functions, or two methods of a class. >> >> Unbounds methods are simply functions which have become attributes of >> a class. Especially in Py3, there is *no* difference. >> >> Bound methods are a special type of partial function. In Python, both >> are something else, though still callables. Conceptually, a partial >> function *is* a function, just with fewer parameters. >> >>> Trouble is, it appears that when the decorator is called the function >>> is not yet bound to an instance, so no matter whether it's a method >>> or function, it looks the same to the decorator. >> >> Right. Whether it is an A or an A, it looks like an A. >> >> Worse: when the decorator is called, there is no class for there to be >> instances of. >>> >>> This simple example illustrates the problem: >> >> Add a second parameter to tell the decorator which variant of behavior >> you want. Or write two variations of the decorator and use the one you >> want. >> >> tjr >> > -- http://mail.python.org/mailman/listinfo/python-list
|