首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何定义具有Python3.5类型提示的TypeVar用于Counter[str]

如何定义具有Python3.5类型提示的TypeVar用于Counter[str]
EN

Stack Overflow用户
提问于 2016-01-02 02:47:42
回答 1查看 2.5K关注 0票数 4

问题1:

我想使用Python3.5的类型暗示语法来定义一个单词类型别名,类似于:

代码语言:javascript
复制
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:
    ...

问题是,我不知道如何使计数器接受它的键的类型参数(在本例中是str;它的值总是ints)。

备选案文1:

由于计数器是dict的一个子类,所以另一种选择可能类似于:

代码语言:javascript
复制
from typing import TypeVar, Dict

# define bag-of-words type
Bow = TypeVar('Bow', Dict[str, int])

尽管这并不能确保我使用的是Counter而不是Dict

备选案文2:

另一个选项是将Bow定义为一个简单的Counter类型,如下所示:

代码语言:javascript
复制
from collections import Counter
from typing import TypeVar

# define bag-of-words type
Bow = TypeVar('Bow', Counter)

不过,这也不太令人满意,因为它没有强制执行计数器上的键类型。

有什么正确的方法来处理这种情况吗?如果是,那又是什么呢?

问题2:

如果我正在创建我自己的类,我如何让它接受一个泛型类型参数?因此,如果我在一个名为Foo的模块中声明了一个类my_module,我将如何使其合法化:

代码语言:javascript
复制
from typing import TypeVar
from my_module import Foo

FooTypeAlias = TypeVar('FooTypeAlias', Foo[str])
EN

回答 1

Stack Overflow用户

发布于 2016-01-22 10:29:14

TypeVar 的目的是在泛型类或独立泛型函数的声明中充当占位符。

您在问题1中似乎要查找的内容可能大致如下:

代码语言:javascript
复制
import typing as tg
from collections import Counter

class Bow(Counter, tg.Mapping[str, int]):
    pass

和来制作一个通用的“任意的东西包”(boas),您可以使用:

代码语言:javascript
复制
import typing as tg
from collections import Counter

S = tg.TypeVar('S')  # STUFF

class Boas(Counter, tg.Mapping[S, int]):
    pass

在这两种情况下,不应该需要类主体:所有功能都将从Counter继承,所有类型都将从以下意义上从tg.Mapping派生:例如,如果您声明

代码语言:javascript
复制
def foo(bag: Bow, what):
    n = bag[what]
    #...

是一个静态类型检查器(如果CounterCounter实现中有类型注释的存根文件),应该能够推断n将是int,并可能得出或假定what将是str。--动态类型检查器(通过装饰foo激活,PyPI typecheck-decorator包将很快提供合适的东西)可能会在调用foo时查看实际的bag对象,并检查要为str的部分或全部密钥和对应的int值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34562113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档