使用 python 在该函数中获取当前函数名称
get current function name inside that function using python
出于我的记录目的,我想记录我的代码所在的所有函数的名称
不管是谁在调用这个函数,我想要我在其中声明这一行的函数名
import inspect
def whoami():
return inspect.stack()[1][3]
def foo():
print(whoami())
目前它打印 foo
,我想打印 whoami
你可能想要 inspect.getframeinfo(frame).function
:
import inspect
def whoami():
frame = inspect.currentframe()
return inspect.getframeinfo(frame).function
def foo():
print(whoami())
foo()
打印
whoami
For my logging purpose i want to log all the names of functions where my code is going
你考虑过装饰器吗?
import functools
def logme(f):
@functools.wraps(f)
def wrapped(*args, **kwargs):
print(f.__name__)
return f(*args, **kwargs)
return wrapped
@logme
def myfunction():
print("Doing some stuff")
实际上,如果这是关于 logging:
,Eric 的回答指明了方向
For my logging purpose i want to log all the names of functions where my code is going
您可以调整格式化程序以记录 function name:
import logging
def whoami():
logging.info("Now I'm there")
def foo():
logging.info("I'm here")
whoami()
logging.info("I'm back here again")
logging.basicConfig(
format="%(asctime)-15s [%(levelname)s] %(funcName)s: %(message)s",
level=logging.INFO)
foo()
打印
2015-10-16 16:29:34,227 [INFO] foo: I'm here
2015-10-16 16:29:34,227 [INFO] whoami: Now I'm there
2015-10-16 16:29:34,227 [INFO] foo: I'm back here again
调用sys._getframe()
获得frame
class实例。 f_code.co_name
成员保存函数名称。
sys._getframe(0).f_code.co_name
添加一个简单的辅助函数func_name()
来包装调用
import sys
def func_name():
return sys._getframe(1).f_code.co_name
def func1():
print(func_name())
func1() # prints 'func1'
这个简单的可重用方法 returns caller/parent 函数的名称:
def current_method_name():
# [0] is this method's frame, [1] is the parent's frame - which we want
return inspect.stack()[1].function
示例:
def whoami():
print(current_method_name())
whoami()
-> 输出为 whoami
在此处添加答案,因为包含 class 名称和函数可能很有用。
这会检查 self
和 cls
约定,以包含 class 名称。
def name_of_caller(frame=1):
"""
Return "class.function_name" of the caller or just "function_name".
"""
frame = sys._getframe(frame)
fn_name = frame.f_code.co_name
var_names = frame.f_code.co_varnames
if var_names:
if var_names[0] == "self":
self_obj = frame.f_locals.get("self")
if self_obj is not None:
return type(self_obj).__name__ + "." + fn_name
if var_names[0] == "cls":
cls_obj = frame.f_locals.get("cls")
if cls_obj is not None:
return cls_obj.__name__ + "." + fn_name
return fn_name
出于我的记录目的,我想记录我的代码所在的所有函数的名称
不管是谁在调用这个函数,我想要我在其中声明这一行的函数名
import inspect
def whoami():
return inspect.stack()[1][3]
def foo():
print(whoami())
目前它打印 foo
,我想打印 whoami
你可能想要 inspect.getframeinfo(frame).function
:
import inspect
def whoami():
frame = inspect.currentframe()
return inspect.getframeinfo(frame).function
def foo():
print(whoami())
foo()
打印
whoami
For my logging purpose i want to log all the names of functions where my code is going
你考虑过装饰器吗?
import functools
def logme(f):
@functools.wraps(f)
def wrapped(*args, **kwargs):
print(f.__name__)
return f(*args, **kwargs)
return wrapped
@logme
def myfunction():
print("Doing some stuff")
实际上,如果这是关于 logging:
,Eric 的回答指明了方向For my logging purpose i want to log all the names of functions where my code is going
您可以调整格式化程序以记录 function name:
import logging
def whoami():
logging.info("Now I'm there")
def foo():
logging.info("I'm here")
whoami()
logging.info("I'm back here again")
logging.basicConfig(
format="%(asctime)-15s [%(levelname)s] %(funcName)s: %(message)s",
level=logging.INFO)
foo()
打印
2015-10-16 16:29:34,227 [INFO] foo: I'm here
2015-10-16 16:29:34,227 [INFO] whoami: Now I'm there
2015-10-16 16:29:34,227 [INFO] foo: I'm back here again
调用sys._getframe()
获得frame
class实例。 f_code.co_name
成员保存函数名称。
sys._getframe(0).f_code.co_name
添加一个简单的辅助函数func_name()
来包装调用
import sys
def func_name():
return sys._getframe(1).f_code.co_name
def func1():
print(func_name())
func1() # prints 'func1'
这个简单的可重用方法 returns caller/parent 函数的名称:
def current_method_name():
# [0] is this method's frame, [1] is the parent's frame - which we want
return inspect.stack()[1].function
示例:
def whoami():
print(current_method_name())
whoami()
-> 输出为 whoami
在此处添加答案,因为包含 class 名称和函数可能很有用。
这会检查 self
和 cls
约定,以包含 class 名称。
def name_of_caller(frame=1):
"""
Return "class.function_name" of the caller or just "function_name".
"""
frame = sys._getframe(frame)
fn_name = frame.f_code.co_name
var_names = frame.f_code.co_varnames
if var_names:
if var_names[0] == "self":
self_obj = frame.f_locals.get("self")
if self_obj is not None:
return type(self_obj).__name__ + "." + fn_name
if var_names[0] == "cls":
cls_obj = frame.f_locals.get("cls")
if cls_obj is not None:
return cls_obj.__name__ + "." + fn_name
return fn_name