Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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 function:

def f(name: List[str]):
    pass

is there a python method that can check whether

name = ['a', 'b']
name = [0, 1]
name = []
name = None
...

fit the type hints?

i know that 'no type checking happens at runtime' but can i still check the validity of these arguments by hand in python?

or if python does not provide that functionality itself: what is the tool i'd need to use?

like image 532
hiro protagonist Avatar asked Sep 29 '15 12:09

hiro protagonist


People also ask

How do you check if a function is an argument in Python?

To extract the number and names of the arguments from a function or function[something] to return ("arg1", "arg2"), we use the inspect module. The given code is written as follows using inspect module to find the parameters inside the functions aMethod and foo.

Does Python check type hints?

Python does not enforce the type hints. You can still change types at will in Python because of this. However some integrated development environments, such as PyCharm, support type hinting and will highlight typing errors. You can also use a tool called Mypy to check your typing for you.

Do type hints slow down Python?

So in short: no, they will not cause any run-time effects, unless you explicitly make use of them. That is incorrect. They need to be resolved when loading the code and they are kept in memory. After the loading there shouldn't be slowdowns.

What is argument's in Python?

An argument is a value that is passed to a function when it is called. It might be a variable, value or object passed to a function or method as input. They are written when we are calling the function.


2 Answers

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.

like image 147
Ilya Peterov Avatar answered Oct 10 '22 05:10

Ilya Peterov


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/

like image 35
Alex Grönholm Avatar answered Oct 10 '22 07:10

Alex Grönholm