python中泛型函数的最佳实践

2024-06-08 13:06:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我读过很多关于泛型类的文章,虽然这些都很酷,但有时,我只需要一个泛型函数。我写了一个小的:

def _matrix_map(self, mapper):
    """returns the matrix applying the mapper funcfunc"""
    return {key: mapper(value) for key, value in self._matrix.items()}

对于类型,这应该如何注释。在具有泛型支持的静态类型化语言中,我将编写如下代码

^{pr2}$

所以,我想我应该这样写:

T = TypeVar('T')
def _matrix_map(self, mapper: Callable[[Tile], T]) -> Dict[Coordinate, T]:

我就这样让mypy通过了,但是pylint讨厌这样。在

第一行:

C0103:Invalid class attribute name "T"

在第二行:

E0602:Undefined variable 'T'

所以我觉得我做错了什么,我可以更改变量名(ttt)?typ?)但这并不能解决第二个问题。我不是第一个想要(静态类型)泛型函数的人,但是我在任何地方都找不到任何好的资源。有什么建议吗?在


Tags: thekeyself类型mapvaluedef文章
1条回答
网友
1楼 · 发布于 2024-06-08 13:06:09

我猜你写的代码大概是这样的?在

class Matrix:
    T = TypeVar('T')

    def _matrix_map(self, mapper: Callable[[Tile], T]) -> Dict[Coordinate, T]:
        # ...snip...

实际上在运行时没有这个问题/mypy没有问题,但是pylint似乎不喜欢将“t”放在类定义的范围内。你可以做的是让派林特满意的是这样做:

^{pr2}$

这与前一个代码片段完全等效,也将满足pylint。在

(作为一个切线,我认为皮林对前者不满意的事实实际上是一个缺陷。不过,公平地说,对于类型提示的最佳实践,目前还没有任何成熟的风格指南/在嵌套范围内放置typevar是一种不常见的用例,因此我想我不能真的责怪他们没有考虑到这种情况。)

唯一的缺点是,在外部使用TypeVar确实显得有些不整洁/似乎会污染全局命名空间。您可以通过将其重命名为_T来部分缓解这种情况,例如,将其重命名为私有的。当您需要另一个泛型类或函数时,也可以重用这个typevar,这也有助于减少命名空间污染。在

有关在Python类型提示中使用泛型的详细信息,请参见http://mypy.readthedocs.io/en/stable/generics.html

相关问题 更多 >