[Python-ideas] Access to function objects
Nick Coghlan
ncoghlan at gmail.com
Tue Aug 9 05:25:16 CEST 2011
On Tue, Aug 9, 2011 at 11:36 AM, Ben Finney <ben+python at benfinney.id.au> wrote:
> Which code object, though? If we can't get at the innermost function
> (which is the code location we're interested in) handling the URL, how
> will we get its line number?
In general, you can't, since Python can't readily tell the difference
between decorators that wrap a function and those that replace it
completely. Even the '__wrapped__' convention adopted by recent
incarnations of functools.wraps (primarily to expose the function
underlying lru_cache) only works for genuine wrapper functions that
use that decorator.
>From outside, a cell referencing the current function (if it was
implemented that way) wouldn't tell you anything new, since the
following identity would hold:
f is f.__closure__[f.__code__.co_freevars.index('__func__')].cell_contents
On any given function, *if* the new cell existed at all, it would
refer to that specific function, not an inner one.
Cheers,
Nick.
P.S. An example with the existing PEP 3135 implicit cell creation:
>>> class C:
... def f(self):
... print(__class__)
...
>>> f = C.f
>>> C is f.__closure__[f.__code__.co_freevars.index('__class__')].cell_contents
True
--
Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia
More information about the Python-ideas
mailing list