Как использовать декораторы функций для проверки типа функции?

Как мне использовать декоратор функций для проверки аргумента другой функции? Я пытаюсь разобраться с декораторами функций, но это очень запутанно.

В идеале я бы хотел, чтобы это работало так: вы передаете int и функцию ниже, и функция работает, иначе вы получите ошибку типа.

@check(int)
def printer(arg):
    print(arg)
>>> printer(5)
5

Это то, что я пробовал, но это не работает.

def check(typ):

    def validate(args):
        if type(args) == typ:
           return validate(args)
        else:
           raise TypeError

    return validate

Любые советы или рекомендации будут оценены, я действительно пытался обернуть голову вокруг декораторов.

Это не конкретная ошибка, код неверен, потому что я не понимаю, как его структурировать, потому что у меня проблемы с пониманием того, как передавать аргументы от декоратора и сравнивать их с аргументами функций.

Safder 26.07.2019 18:09

ваша основная тема - получить тип функции, а в коде вы проверяли тип аргументов. Пожалуйста, спросите четко, что вы хотите знать. и в ответ я написал о декораторе на непрофессиональном языке.

Mayank Jain 26.07.2019 19:56
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
377
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

check(int) по-прежнему должен возвращать функцию.

def check(typ):
    def checker(f):
        def checked_func(arg):
            if isinstance(arg, typ):
                return f(arg)
            else:
                raise TypeError
        return checked_func
    return checker

Теперь _ является фактическим декоратором, возвращаемым check, а _ берет исходную функцию и оборачивает ее в функцию Другой, которая проверяет тип аргумента и либо возвращает результат исходной функции, примененной к аргументу, либо вызывает TypeError.

Было бы легче следовать, если бы мы разбили его на несколько частей.

int_checker = check(int)

@int_checker
def printer(arg):
    print(arg)

Благодарю вас! Это было то место, где вы вызвали f(arg) Я не мог понять, но то, что это написано, имеет большой смысл. У меня были проблемы с порядком, в котором они были упакованы. Почему средство проверки возврата не принимает никаких аргументов?

Safder 26.07.2019 18:10

Это помогает мне создавать декораторов снизу вверх. Начните с определения функции, которой вы хотите заменить printer, затем оберните ее функцией, которая принимает printer в качестве аргумента и использует ее при замене. Затем оберните тот в функцию, которая абстрагирует проверяемый тип.

chepner 26.07.2019 18:12

Также имейте в виду, что украшение — это просто синтаксический сахар для комбинации применения функции и присвоения переменной: @func(x) def foo():... — это то же самое, что def foo():...; foo = func(foo).

chepner 26.07.2019 18:17

Хорошо, это имеет смысл. Спасибо еще раз.

Safder 26.07.2019 18:24

В питоне все является объектом, даже функции. позвольте мне написать функцию по-другому, просто чтобы выразить

def fun(arg):

можно выразить как

fun(a variable) = function(arg) # just like we write in JS

так как мы также можем присвоить другое значение переменной. то же самое мы можем назначить другую функцию для данного имени функции.

вкратце значение декоратора состоит в том, чтобы назначить другую функцию имени функции, поверх которой она написана

@deco
def func(arg):

такой же, как

 func = deco(func)

и для этого возвращаемый тип декоратора должен быть указателем на другую функцию.

Итак, синтаксис декоратора такой:

def deco_func(func): # the parameter is a function
    def wrap_func(args):  #the args are the argument of original function
        #what ever you want to do
        return func(args) #call for original function
retunr wrap_func   # returning of the pointer of the wrap function.

Другие вопросы по теме