Вы можете получить список аргументов функции, используя inspect
.Это включает в себя значения по умолчанию, но, конечно, не может предоставить типы, потому что сами определения не имеют этой информации.
Декораторы, подобные показанному вами, кажутся лучшим решением для 2.x, если вам нужна информация о типе.Но я бы, вероятно, сделал их синтаксис немного менее круглым:
@validate(a=(int, 1, 10), b=(float, 1, 10), c=bool, returns=(int, -10, 10))
def foo(a, b, c): ...
Вы можете обнаружить очевидные ошибки, если ваш декоратор действительно проверит arglist функции и убедится, что он соответствует аргументам декоратора.Не нужно изменять фактическую функцию, если вы не хотите добавлять проверочный код.
Обратите внимание, что вам понадобится специальная обработка для *arg
и **kwarg
: это гораздо сложнее, чтобы предоставить информацию о типе дляи я не знаю, насколько f1(int, int, int)
похож на f2(int, *ints)
, не говоря уже о f3(int, **kwargs)
.