Как мне использовать декоратор функций для проверки аргумента другой функции? Я пытаюсь разобраться с декораторами функций, но это очень запутанно.
В идеале я бы хотел, чтобы это работало так: вы передаете 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
Любые советы или рекомендации будут оценены, я действительно пытался обернуть голову вокруг декораторов.
ваша основная тема - получить тип функции, а в коде вы проверяли тип аргументов. Пожалуйста, спросите четко, что вы хотите знать. и в ответ я написал о декораторе на непрофессиональном языке.
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) Я не мог понять, но то, что это написано, имеет большой смысл. У меня были проблемы с порядком, в котором они были упакованы. Почему средство проверки возврата не принимает никаких аргументов?
Это помогает мне создавать декораторов снизу вверх. Начните с определения функции, которой вы хотите заменить printer
, затем оберните ее функцией, которая принимает printer
в качестве аргумента и использует ее при замене. Затем оберните тот в функцию, которая абстрагирует проверяемый тип.
Также имейте в виду, что украшение — это просто синтаксический сахар для комбинации применения функции и присвоения переменной: @func(x) def foo():...
— это то же самое, что def foo():...; foo = func(foo)
.
Хорошо, это имеет смысл. Спасибо еще раз.
В питоне все является объектом, даже функции. позвольте мне написать функцию по-другому, просто чтобы выразить
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.
Это не конкретная ошибка, код неверен, потому что я не понимаю, как его структурировать, потому что у меня проблемы с пониманием того, как передавать аргументы от декоратора и сравнивать их с аргументами функций.