2009-05-22 33 views
74

Nếu bạn có 2 chức năng như:Lấy tên hàm người gọi bên trong một hàm khác trong Python?

def A 
def B 

và A gọi B, bạn có thể nhận được ai đang gọi B bên B, như:

def A() : 
    B() 

def B() : 
    this.caller.name 
+1

Bạn có sẵn nguồn. Tại sao bạn cần một thứ như vậy? –

+12

Vì tôi đang gỡ lỗi mã trong trình thông dịch python của ứng dụng bên thứ ba mà không có trình gỡ lỗi thực. –

+3

bản sao có thể có của [Python: Cách lấy tên phương thức của người gọi trong phương thức được gọi?] (Http://stackoverflow.com/questions/2654113/python-how-to-get-the-callers-method-name-in phương pháp được gọi là – bernie

Trả lời

103

Bạn có thể sử dụng các mô-đun inspect để có được sự kêu gọi cây rơm. Nó trả về một danh sách các bản ghi khung. Phần tử thứ ba trong mỗi bản ghi là tên người gọi. Những gì bạn muốn là:

>>> import inspect 
>>> def f(): 
...  print inspect.stack()[1][3] 
... 
>>> def g(): 
...  f() 
... 
>>> g() 
g 

Tất nhiên, bạn nên kiểm tra xem có đủ bản ghi khung trước khi thử truy cập một chỉ mục cụ thể hay không.

+6

trên python 3.4 ít nhất điều này không hoạt động, chúng đã thay đổi thứ tự của các bộ dữ liệu. Một tuple được đặt tên hiện đang được sử dụng vì vậy tốt nhất nên sử dụng inspect.stack() [1] .filename – timeyyy

8

như trong ví dụ dưới đây:

>>> def foo(): 
... global x 
... x = sys._getframe(1) 
... 
>>> def y(): foo() 
... 
>>> y() 
>>> x.f_code.co_name 
'y' 
>>> 

Lưu ý quan trọng: vì nó là rõ ràng từ tên _getframe phương pháp (hey, nó bắt đầu với một dấu gạch dưới), nó không phải là một phương pháp API ai nên không suy nghĩ dựa vào .

+9

[sys._getframe] (http://docs.python.org/library/sys.html#sys._getframe) là "không được bảo đảm tồn tại trong mọi triển khai Python" - tôi nghĩ điều này là quan trọng cần lưu ý. – RWS

+0

@RWS, cảm ơn, đã ghi chú –

2

bạn có thể sử dụng các module khai thác gỗ và chỉ định% (filename) s tùy chọn trong BaseConfig()

import logging 
logging.basicConfig(filename='/tmp/test.log', level=logging.DEBUG, format='%(asctime)s | %(levelname)s | %(funcName)s |%(message)s') 

def A(): 
    logging.info('info') 
+1

Bạn vô tình nói tùy chọn '% (tên tệp) s '. Nó phải là những gì bạn có trong ví dụ mã của bạn: '% (funcName) s' :) –

10

Có hai cách, sử dụng sysinspect module:

  • inspect.stack()[1][3]

Dạng stack() ít có thể đọc và thực hiện phụ thuộc vì nó gọi sys._getframe(), thấy chiết xuất từ ​​inspect.py:

def stack(context=1): 
    """Return a list of records for the stack above the caller's frame.""" 
    return getouterframes(sys._getframe(1), context) 
4

này làm việc cho tôi! : D

>>> def a(): 
...  import sys 
...  print sys._getframe(1).f_code.co_name 
... 
>>> def b(): 
...  a() 
... 
... 
>>> b() 
b 
>>> 
Các vấn đề liên quan