Python: __qualname__ функции с декоратором - PullRequest
0 голосов
/ 12 июня 2018

Я использую Decorator (класс) в методе Instance другого класса, например:

class decorator_with_arguments(object):

    def __init__(self, arg1=0, arg2=0, arg3=0):
        self.arg1 = arg1
        self.arg2 = arg2
        self.arg3 = arg3

    def __call__(self, f):
        print("Inside __call__()")
        def wrapped_f(*args):
            print(f.__qualname__)
            f(*args)
        return wrapped_f

class Lol:
    @decorator_with_arguments("hello")
    def sayHello(self,a1, a2, a3, a4):
        print(self.sayHello.__qualname__)

Теперь, когда я печатаю self.sayHello.__qualname__, он печатает decorator_with_arguments.__call__.<locals>.wrapped_f

Есть ли способ переопределить это?Я хочу видеть здесь Lol.sayHello ( qualname моей исходной функции).

Я попытался переопределить @property __qualname__ из __call__ (со статической строкой);не работал.

1 Ответ

0 голосов
/ 12 июня 2018

Вы можете просто скопировать атрибут __qualname__ в свою wrapped_f функцию-обертку ;В конце концов, именно эта функция возвращается при применении декоратора.

Вы можете использовать @functools.wraps() декоратор , чтобы сделать это для вас, вместе с другими атрибутами заметки:

from functools import wraps

class decorator_with_arguments(object): 
    def __init__(self, arg1=0, arg2=0, arg3=0):
        self.arg1 = arg1
        self.arg2 = arg2
        self.arg3 = arg3

    def __call__(self, f):
        print("Inside __call__()")
        @wraps(f)
        def wrapped_f(*args):
            print(f.__qualname__)
            f(*args)
        return wrapped_f

Декоратор @wraps(f) копирует соответствующие атрибуты из f в wrapped_f, включая __qualname__:

>>> Lol.sayHello.__qualname__
'Lol.sayHello'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...