[英]Function to return the function name and line
您可以獲得 function 名稱和行sys._getframe().f_code.co_name
和sys._getframe().f_lineno
。
我想要一個圍繞這些(尷尬的)值的包裝器,比如:
def fn(): return sys._getframe().f_code.co_name
def line(): return sys._getframe().f_lineno
但這是行不通的。
例如下面的代碼
import sys
def fn(): return sys._getframe().f_code.co_name
def line(): return sys._getframe().f_lineno
def main():
print(sys._getframe().f_code.co_name, fn())
print(sys._getframe().f_lineno, line())
main()
應該返回
main main
8 8
但它反而返回
main fn
8 4
我怎樣才能達到預期的效果?
編輯:事實證明,您可以僅依靠sys
來完成它,方法是將參數1
傳遞給sys._getframe
以獲取當前幀fn
以下的幀。 根據python 文檔:
sys._getframe([深度])
從調用堆棧返回幀 object。 如果給出了可選的 integer 深度,則返回堆棧頂部以下多次調用的幀 object。 如果它比調用堆棧更深,則會引發 ValueError。 深度的默認值為零,返回調用堆棧頂部的幀。
您的代碼將如下所示:
import sys
def fn(): return sys._getframe(1).f_code.co_name
def line(): return sys._getframe(1).f_lineno
def main():
print(sys._getframe().f_code.co_name, fn())
print(sys._getframe().f_lineno, line())
main()
Output
main main
8 8
sys._getframe().f_code.co_name
將返回當前的 function,它始終是fn
。 要獲取當前幀下方的幀,請使用traceback
:
import sys
import inspect
def fn(): return inspect.stack()[-2].function
def line(): return inspect.stack()[-2].lineno
def main():
print(sys._getframe().f_code.co_name, fn())
print(sys._getframe().f_lineno, line())
main()
Output
main main
9 9
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.