Nhờ Jon Clements câu trả lời tôi đã có thể làm cho một hàm trả về một danh sách đặt hàng của tất cả những người gọi:
def f1():
names = []
frame = inspect.currentframe()
## Keep moving to next outer frame
while True:
try:
frame = frame.f_back
name = frame.f_code.co_name
names.append(name)
except:
break
return names
và khi gọi trong một chuỗi:
def f2():
return f1()
def f3():
return f2()
def f4():
return f3()
print f4()
trông như thế này:
['f2', 'f3', 'f4', '<module>']
Trong trường hợp của tôi, tôi lọc ra bất cứ điều gì ở '<module>'
và sau đó, và sau đó lấy mục cuối cùng là tên của người gọi có nguồn gốc.
Hoặc sửa đổi vòng lặp ban đầu để giải cứu tại sự xuất hiện đầu tiên của tên bất kỳ bắt đầu với '<'
:
frame = frame.f_back
name = frame.f_code.co_name
if name[0] == '<':
break
names.append(name)
Nguồn
2014-01-29 20:36:46
Từ các tài liệu: 'Nó không được đảm bảo để tồn tại trong tất cả các triển khai của Python.' – pradyunsg