Помогите с декоратором, а именно с проверкой чисел в нем

Рейтинг: 1Ответов: 1Опубликовано: 18.02.2023
import functools
import string
def validate_args(func):
    @functools.wraps(func)
    def wrap(*args):
        if len(args) < 2:
            return 'No enough arguments'
        elif len(args) > 2:
            return 'Too many arguments'
        elif not all(str(x.isdigit()) for x in args):
            return 'Wrong types'
        else:
            return func(*args)
    return wrap

@validate_args
def add_numbers(x, y):
    """Return sum of x and y"""
    return x + y


assert add_numbers(4, 5) == 9
assert add_numbers(4) == 'No enough arguments'
assert add_numbers('hello') == 'No enough arguments'
assert add_numbers(3, 5, 6) == 'Too many arguments'
assert add_numbers('a', 'b', 'c') == 'Too many arguments'
assert add_numbers(4.5, 5.1) == 'Wrong types'
assert add_numbers('hello', 4) == 'Wrong types'
assert add_numbers(9, 'hello') == 'Wrong types'
assert add_numbers([1, 3], {}) == 'Wrong types'
assert add_numbers.__name__ == 'add_numbers'
assert add_numbers.__doc__.strip() == 'Return sum of x and y'
print('Good')

У меня возникает ошибка AttributeError: 'int' object has no attribute 'isdigit' я не пойму как это решить...

Ответы

▲ 2Принят

Тут у вас ошибка из-за x не являющегося строкой:

elif not all(str(x.isdigit()) for x in args):

Поменяйте на:

elif not all(str(x).isdigit() for x in args):