2011-09-15 32 views
6

thể trùng lặp:
How to get the function name as string in Python?Cách lấy tên hàm dưới dạng chuỗi trong Python?

Tôi biết rằng tôi có thể làm điều đó:

def func_name(): 
    print func_name.__name__ 

đó sẽ trở lại tên của hàm là 'my_func'.

Nhưng khi tôi tham gia vào chức năng, có cách nào để gọi trực tiếp nó một cách tổng quát không? Một cái gì đó như:

def func_name(): 
    print self.__name__ 

Trong đó Python sẽ hiểu rằng tôi muốn phần trên của phân cấp mã của tôi?

+1

btw, 'self' không phải là một từ khóa kỳ diệu trong Python, nó chỉ là một quy ước cho việc đặt tên tham số đầu tiên được truyền cho một phương thức cá thể (là trường hợp mà phương thức được ràng buộc). – geoffspear

+1

Tôi không nghĩ có giải pháp dễ dàng nào. Kiểm tra câu hỏi này http://stackoverflow.com/questions/5063607/is-there-a-self-flag-can-reference-python-function-inside-itself – rplnt

+1

Bạn định sử dụng tên cho mục đích gì? –

Trả lời

5

AFAIK, không có. Bên cạnh đó, ngay cả phương pháp đầu tiên của bạn không phải là hoàn toàn đáng tin cậy, vì một đối tượng chức năng có thể có nhiều tên:

In [8]: def f(): pass 
    ...: 

In [9]: g = f 

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

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

Một phương pháp có thể sẽ được sử dụng Decorators:

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 

Vấn đề với điều này là bạn sẽ chỉ có thể in tên hàm trước hoặc sau khi gọi hàm thực tế.

Thực tế, vì bạn đã xác định được chức năng, bạn có thể chỉ mã hóa tên không?

5

Bạn cũng có thể sử dụng các mô-đun traceback:

import traceback 

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


if __name__ == "__main__": 
    test() 
Các vấn đề liên quan