Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to make python throw errors if the type of the argument passed to the annotated function doesn't match the one specified?

Tags:

One of the new features in python3.5 is type hinting. For example the code below is valid now:

def greeting(name: str) -> str:
    return 'Hello ' + name

But, as I understand, it doesn't check anything by itself and also is interpreted absolutely the same way as this:

def greeting(name):
    return 'Hello ' + name

and was implemented mostly to help static analyzers (and to make code that is easier to understand). But is there (or is planned to be implemented in the future) any way (maybe by using some third-party libraries) to make python throw errors when an argument of an invalid type is passed to a function with annotated argument types (using only type-hinting syntax)?

like image 889
Ilya Peterov Avatar asked Sep 19 '15 11:09

Ilya Peterov


People also ask

Does Python enforce type hints?

The Python runtime does not enforce function and variable type annotations. They can be used by third party tools such as type checkers, IDEs, linters, etc. This module provides runtime support for type hints. The most fundamental support consists of the types Any , Union , Callable , TypeVar , and Generic .

What is type annotation in Python?

Type annotations — also known as type signatures — are used to indicate the datatypes of variables and input/outputs of functions and methods. In many languages, datatypes are explicitly stated. In these languages, if you don't declare your datatype — the code will not run.

Can you specify types in Python?

Recent versions of Python allow you to specify explicit type hints that can be used by different tools to help you develop your code more efficiently. In this tutorial, you'll learn about the following: Type annotations and type hints. Adding static types to code, both your code and the code of others.

What does type ignore do in Python?

You can use the form # type: ignore[<code>] to only ignore specific errors on the line. This way you are less likely to silence unexpected errors that are not safe to ignore, and this will also document what the purpose of the comment is.


1 Answers

Type hints implement PEP 0484 which explicitly lists as a non-goal:

While the proposed typing module will contain some building blocks for runtime type checking -- in particular the get_type_hints() function -- third party packages would have to be developed to implement specific runtime type checking functionality, for example using decorators or metaclasses. Using type hints for performance optimizations is left as an exercise for the reader.

From this it seems to follow that the Python developers have no plan to add the functionality that you seek. The quote mentions decorators and that does seem the way to go. In concept it seems straightforward -- the decorator would use get_type_hints() on the function to be decorated and would iterate through the arguments, checking their types against any hints, either throwing an error if there is a clash or simply passing on the arguments to the function. This would be similar to pzelasko's answer but with the decorator using the hints to automatically handle the boiler-plate code. The simplest approach would be to simply vet the arguments, though you should also be able to make a decorator which would raise an error if the return type clashes with the hint. I don't yet have Python 3.5 and don't have the time to pursue it -- but it seems like a good learning exercise for someone who wants to learn about both decorators and type hints. Perhaps you can be one of the "third parties" the PEP alludes to.

like image 82
John Coleman Avatar answered Oct 12 '22 23:10

John Coleman