gpt4 book ai didi

python - 获取带有装饰器的函数的父类名

转载 作者:行者123 更新时间:2023-12-04 12:31:07 25 4
gpt4 key购买 nike

让有一个具有函数的类:

class Tester:

@Logger()
def __init__(self):
print(__class__)

@Logger()
def func(self, num):
return num**2

其中Logger是一个装饰器,大致定义为:

from typing import Optional, Any
from logging import getLogger

class Logger:
def __init__(self):
self.logger = getLogger()
self.logging_function = getattr(self, 'function')

def __call__(self, decorator: callable):

def f(*args, **kwargs):
return self.logging_function(decorator, *args, **kwargs)

return f

def function(self, func: callable, *args: Optional[Any], **kwargs: Optional[Any]):
func_name = Logger.get_name(func)
self.logger.info(f"Starting: {func_name}.")
return func(*args, **kwargs)

@staticmethod
def get_name(func):
return f'__init__ {func.__class__.__name__}' if func.__name__ == '__init__' else func.__name__

我们如何编辑 Logger get_name 函数,这样如果正在运行的函数是 class __init__ 返回的名称是 __init__ Tester,但如果该函数被命名为其他名称,它仅返回函数 __name__?

(又称)预期输出:

>>> test = Tester()
INFO: Starting __init__ Tester.
<class '__main__.Tester'>

>>> test.func(3)
INFO: Starting func.
9

当前输出:

>>> test = Tester()
INFO: Starting __init__ function.
<class '__main__.Tester'>

>>> test.func(3)
INFO: Starting func.
9

最佳答案

您可以使用 qualified name而是像这样:

@staticmethod
def get_name(func):
return func.__qualname__

这会给你类似的东西:

>>> test = Tester()
INFO:Starting: Tester.__init__.
<class '__main__.Tester'>
>>> test.func(3)
INFO:Starting: Tester.func.
9

您可能还对 standard LogRecord attribute 感兴趣funcName 函数中做类似的事情。一个基本的演示:

import logging
logging.basicConfig(
level=logging.INFO,
format="%(levelname)s (%(funcName)s) %(message)s",
)

log = logging.getLogger()

class A:
def my_method(self):
log.info("hello")

def bar():
log.info("world")

A().my_method()
bar()

输出这个:

INFO (my_method) hello
INFO (bar) world

关于python - 获取带有装饰器的函数的父类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69018489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com