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 |
但是,如果上面的
1 2 3 4 | def bb(): print bb.__name__ print bb.__hash__ # other simliar |
类方法中是否有类似于
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函数描述符有一个协议:这是用来创建
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__ |
所以,你可以使用
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> >>> |