关于python:函数引用自身是否有一种通用的方法?

Is there a generic way for a function to reference itself?

我可以通过以下代码访问函数本身内部的python函数属性:

1
2
3
4
def aa():
    print aa.__name__
    print aa.__hash__
    # other simliar

但是,如果上面的aa()函数是用于编写其他代码的模板,例如bb()函数,那么我必须编写:

1
2
3
4
def bb():
    print bb.__name__
    print bb.__hash__
    # other simliar

类方法中是否有类似于self参数的"指针",以便我可以这样编写代码?

1
2
3
4
def whatever():
    print self.__name__
    print self.__hash__
    # other simliar

我搜索并发现有人说要使用类来解决这个问题,但是重新定义所有现有的函数可能会很麻烦。有什么建议吗?


有没有一个通用的单向函数的问题本身。考虑用装饰代替。如果你想要的一切是你指定的打印信息的函数,可以做很容易:一个鱼鳞

1
2
3
4
5
6
7
8
9
10
11
from functools import wraps
def showinfo(f):
    @wraps(f)
    def wrapper(*args, **kwds):
         print(f.__name__, f.__hash__)
         return f(*args, **kwds)
    return wrapper

@showinfo
def aa():
    pass

如果你真的需要做的只是添加参考函数,那么它的参数的函数:

1
2
3
4
5
6
7
8
9
10
def withself(f):
    @wraps(f)
    def wrapper(*args, **kwds):
        return f(f, *args, **kwds)
    return wrapper

@withself
def aa(self):
      print(self.__name__)
      # etc.

编辑添加额外的装饰。

你可以写一个简单的(和因此可能更快),这将使鱼鳞功能正确工作包与python的introspection:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def bind(f):
   """Decorate function `f` to pass a reference to the function
    as the first argument"""

    return f.__get__(f, type(f))

@bind
def foo(self, x):
   "This is a bound function!"
    print(self, x)


>>> foo(42)
<function foo at 0x02A46030> 42
>>> help(foo)
Help on method foo in module __main__:

foo(self, x) method of builtins.function instance
    This is a bound function!

本leverages python函数描述符有一个协议:这是用来创建__get__法结合的方法。现有的方法使用简单的装饰功能的A型方法做准备。它只会工作,如果你想要独立的函数,a method to可以参考它,你会做更多的东西像原来的解决方案。


http://docs.python.org /图书馆/ inspect.html看起来有前途:

1
2
3
4
import inspect
def foo():
     felf = globals()[inspect.getframeinfo(inspect.currentframe()).function]
     print felf.__name__, felf.__doc__

所以,你可以使用sys模块得到的流函数的名字:

1
2
3
4
import sys
def bar():
     felf = globals()[sys._getframe().f_code.co_name]
     print felf.__name__, felf.__doc__


快速黑客如何让您自己的"自我"的名字,像这样:

1
2
3
4
5
6
7
8
9
10
>>> def f():
...     self = f
...     print"My name is", self.__name__,"and I am", self.__hash__
...
>>> f()
My name is  f and I am <method-wrapper '__hash__' of function object at 0x00B50F30>
>>> x = f
>>> x()
My name is  f and I am <method-wrapper '__hash__' of function object at 0x00B50F30>
>>>