python 3.5 type hints: can i check if function arguments match type hints?

前端 未结 2 2074
我寻月下人不归
我寻月下人不归 2020-12-16 19:15

does python 3.5 provide functions that allow to test whether a given argument would fit the type hints given in the function declaration?

if i have e.g. this functio

相关标签:
2条回答
  • 2020-12-16 19:16

    Python itself doesn't provide such functions, you can read more about it here:


    I wrote a decorator for that. This is the code of my decorator:

    from typing import get_type_hints
    
    def strict_types(function):
        def type_checker(*args, **kwargs):
            hints = get_type_hints(function)
    
            all_args = kwargs.copy()
            all_args.update(dict(zip(function.__code__.co_varnames, args)))
    
            for argument, argument_type in ((i, type(j)) for i, j in all_args.items()):
                if argument in hints:
                    if not issubclass(argument_type, hints[argument]):
                        raise TypeError('Type of {} is {} and not {}'.format(argument, argument_type, hints[argument]))
    
            result = function(*args, **kwargs)
    
            if 'return' in hints:
                if type(result) != hints['return']:
                    raise TypeError('Type of result is {} and not {}'.format(type(result), hints['return']))
    
            return result
    
        return type_checker
    

    You can use it like that:

    @strict_types
    def repeat_str(mystr: str, times: int):
        return mystr * times
    

    Though it's not very pythonic to restrict your function to accept only one type. Though you can use abc (abstract base classes) like number (or custom abc) as type-hints and restrict your functions to accept not only one type, but whatever combination of types you want.


    Added a github repo for it, if anybody wants to use it.

    0 讨论(0)
  • 2020-12-16 19:26

    This is an old question, but there is a tool I've written for doing run time type checking based on type hints: https://pypi.org/project/typeguard/

    0 讨论(0)
提交回复
热议问题