簡體   English   中英

Function 返回 function 名稱和線路

[英]Function to return the function name and line

您可以獲得 function 名稱和行sys._getframe().f_code.co_namesys._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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM