Уведомления

Группа в Telegram: @pythonsu

#1 Июль 13, 2022 22:24:18

VadimK
Зарегистрирован: 2013-07-03
Сообщения: 199
Репутация: +  16  -
Профиль   Отправить e-mail  

Декоратор и параметры

 # python 3.10
def pre_params(_func=None, *, delay=0):
    def pre_execute(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            print(f'Pre executing with delay {delay}')
            return func(*args, **kwargs)
        return wrapper
    print (f'_func: {_func}')
    if _func is None:
        return pre_execute
    else:
        return pre_execute(_func)
@pre_params
def sample_function(value: int, name: str) -> str:
    print(f'{name} on {value}')
    return 'RUN OK'
@pre_params(delay=10)
def sample_function(value: int, name: str) -> str:
    print(f'{name} on {value}')
    return 'RUN OK'

Собственно есть декоратор и пример его использования. И к этому вопросы

1. в самой первой строке идет вызов параметров. Что за “ *, ” в качестве второго параметра ?
2. почему при вызове декоратора без параметра, _func имеет значение равное “<function sample_function at 0x7f2395d62200>” , а при вызове с параметром, _func = None

Офлайн

#2 Июль 14, 2022 00:12:44

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9894
Репутация: +  854  -
Профиль   Отправить e-mail  

Декоратор и параметры

VadimK
1. в самой первой строке идет вызов параметров. Что за “ *, ” в качестве второго параметра ?
https://peps.python.org/pep-3102/
Это означает “голая звёздочка”. До звёздочки стоят аргументы, которые можно передавать в функцию по позиции, по имени или путём их пропускания. После звёздочки стоят аргументы, которые можно передавать в функцию только по имени или путём их пропускания. Аргументы после звёздочки нельзя передавать по позиции.



Отредактировано py.user.next (Июль 14, 2022 00:30:43)

Онлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version