python — Вручную выполнять ограничения ввода с помощью классов ввода

Я хочу проверить тип некоторого параметра, предпочтительно используя определения typing

e.g:

from typing import List, Dict

def func(param1, param2):
     assert param1 is of type Dict[str, int] # How can this be done?
     assert param2 is of type List[Any] # How can this be done?

Это легко для несложных типов. assert isinstance(param1, str)

Вопрос явно упрощен, чтобы было понятно


person user972014    schedule 25.01.2019    source источник
comment
Модуль typing, кажется, используется только для подсказок типа - на самом деле никакого принудительного применения.   -  person iBug    schedule 25.01.2019
comment
Да, я понял. Мне интересно, есть ли еще способ его использовать   -  person user972014    schedule 25.01.2019
comment
Поскольку списки и словари Python не ограничены отдельными типами, вам придется перечислить коллекции и проверить каждый элемент.   -  person Loocid    schedule 25.01.2019


Ответы (2)


Вы можете использовать такие библиотеки, как enforce или typeguard для принудительного применения аннотаций типов во время выполнения.

person gilch    schedule 25.01.2019

Согласно вводу текста, он предназначен только для того, чтобы сделать подсказки текста более читабельными, а не проверка типов на самом деле обеспечивается Python.

Поскольку списки и словари могут содержать произвольные типы (для словарей они должны быть хэшируемыми, но все же «почти произвольными»), единственный способ сделать это — перебрать коллекцию и проверить каждый элемент.

assert isinstance(param1, dict)
for k, v in param1.items():
    assert isinstance(k, str)
    assert isinstance(v, int)
person iBug    schedule 25.01.2019