Вопрос 1:
Я хотел бы определить псевдоним типа мешка слов, используя синтаксис подсказки типа Python 3.5, что-то вроде строк:
from collections import Counter
from typing import TypeVar
# define bag-of-words type
Bow = TypeVar('Bow', Counter[str])
def process_bag_of_words(bag_of_words: Bow) -> Bow:
...
Проблема в том, что я не знаю, как заставить Counter принимать аргумент типа для своих ключей (в данном случае str
; его значения всегда int
s).
Опция 1:
Поскольку counter является подклассом dict, альтернативой может быть что-то вроде:
from typing import TypeVar, Dict
# define bag-of-words type
Bow = TypeVar('Bow', Dict[str, int])
Хотя это не гарантирует, что я работаю с Counter
, а не с Dict
.
Вариант 2:
Другой вариант — определить Bow
как простой тип Counter
, например:
from collections import Counter
from typing import TypeVar
# define bag-of-words type
Bow = TypeVar('Bow', Counter)
Однако это тоже не очень хорошо, поскольку не применяет тип ключа к счетчику.
Есть ли правильный способ справиться с этой ситуацией? Если так, то, что это?
Вопрос 2:
Если бы я создавал свой собственный класс, как бы я мог принять параметр универсального типа? Итак, если бы я объявил класс Foo
в модуле с именем my_module
, как бы я сделал это законным:
from typing import TypeVar
from my_module import Foo
FooTypeAlias = TypeVar('FooTypeAlias', Foo[str])