Is there a way to get the function a decorator has wrapped?

我只是一个虾纸丫 提交于 2019-12-06 05:13:42

问题


Suppose I have

@someDecorator
def func():
   '''this function does something'''
   print 1

Now, the object func is an instance of someDecorator. Is there some way I can access the function it holds, i.e something like func.getInnerFunction().

For instance, if I need to retrieve the doc string of func().


回答1:


See functools.wraps: http://docs.python.org/library/functools.html. The decorator gets the name and doc string of the original function. You use it like this:

def decorator(f):
    @functools.wraps(f)
    def wrapper():
        ....



回答2:


SilentGhost and sri have partial answers for how to deal with this. But the general answer is no: there is no way to get the "wrapped" function out of a decorated function because there is no requirement that the decorator wrap the function in the first place. It may very well have returned an entirely unrelated function, and any references to your original may have already been garbage collected.




回答3:


Are you looking for something along these lines?

>>> def dec(f):
    def inner():
        print(f.__doc__)
    return inner

>>> @dec
def test():
    """abc"""
    print(1)


>>> test()
abc

You're passing function explicitly to the decorator, of course you can access it.




回答4:


You can attach the wrapped function to the inner function

In [1]: def wrapper(f):
   ...:     def inner():
   ...:         print "inner"
   ...:     inner._orig = f
   ...:     return inner
   ...: 

In [2]: @wrapper
   ...: def foo():
   ...:     print "foo"
   ...:     
   ...:     

In [3]: foo()
inner

In [4]: foo._orig()
foo



回答5:


You can try using the undecorated library:

With your example func, you could simply do this to return the original function:

undecorated(func)


来源:https://stackoverflow.com/questions/1545178/is-there-a-way-to-get-the-function-a-decorator-has-wrapped

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!