Аббревиатура Введите Python набрав - PullRequest
2 голосов
/ 24 марта 2020

Я хотел бы проверить, что параметр функции является допустимым. Как мне сделать это с Python 's typing модулем?

Я искал документацию, но ничего не нашел. Но, возможно, можно создать кастом Type. Как бы я это сделал?

Ответы [ 2 ]

3 голосов
/ 24 марта 2020

Для подсказки стандартного поведения __getitem__ используйте обобщенные c версии collections.abc, такие как typing.Sequence, typing.MutableSequence, typing.Mapping или typing.MutableMapping.

from typing import Mapping

def get(container: Mapping, key):
    return container[key]

get({1: 'one', 2: 'two'}, 2)

Чтобы ввести подсказку любой тип, поддерживающий __getitem__, определите пользовательский typing.Protocol с помощью желаемое поведение.

from typing import Protocol, Any

class Lookup(Protocol):
      def __getitem__(self, key) -> Any: ...

def get(container: Lookup, key):
    return container[key]

get(['zero', 'one', 'two'], 2)

Обратите внимание, что типы последовательности и отображения являются обобщенными c, и протокол также может быть определен как generi c.

from typing import Protocol, TypeVar

K = TypeVar('K', contravariant=True)
V = TypeVar('V', covariant=True)


class Lookup(Protocol[K, V]):
    def __getitem__(self, key: K) -> V: ...


def get(container: Lookup[K, V], key: K) -> V:
    return container[key]


get({1: 'one', 2: 'two'}, 2)    # succeeds type checking
get({1: 'one', 2: 'two'}, '2')  # fails type checking
0 голосов
/ 24 марта 2020

Что-то в этом духе (хотя и не проверенное) должно это сделать:

from typing import Protocol, TypeVar

K = TypeVar("K")
V = TypeVar("V")

class Subscriptable(Protocol[K, V]):
    def __getitem__(self, k: K) -> V:
        ...
...