如何在Python中将函数名称作为字符串?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How to get the function name as string in Python?

我知道我能做到:

1
2
def func_name():
    print func_name.__name__

它将返回函数名'my_func'。

但是当我研究这个函数时,有没有一种方法可以直接调用它?喜欢的东西:

1
2
def func_name():
    print self.__name__

在哪种Python中,我想要代码层次结构的上层?


不是一般意义上的,但是您可以利用inspect

1
2
3
4
5
6
7
import inspect

def callee():
    return inspect.getouterframes(inspect.currentframe())[1][1:4][2]

def my_func():
    print callee() // string my_func

源http://code.activestate.com/recipes/576925-caller-and-callee/


你也可以使用traceback模块:

1
2
3
4
5
6
7
8
9
import traceback

def test():
    stack = traceback.extract_stack()
    print stack[len(stack)-1][2]


if __name__ =="__main__":
    test()


AFAIK,没有。此外,即使你的第一个方法也不完全可靠,因为一个函数对象可以有多个名称:

1
2
3
4
5
6
7
8
9
10
In [8]: def f(): pass
   ...:

In [9]: g = f

In [10]: f.__name__
Out[10]: 'f'

In [11]: g.__name__
Out[11]: 'f'

一种可能的方法是使用装饰器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def print_name(func, *args, **kwargs):
   def f(*args, **kwargs):
      print func.__name__
      return func(*args, **kwargs)
   return f

@print_name
def funky():
   print"Hello"

funky()

# Prints:
#
# funky
# Hello

问题是,您只能在调用实际函数之前或之后打印函数名。

实际上,既然已经定义了函数,就不能硬编码名称吗?