我读过很多关于泛型类的文章,虽然这些都很酷,但有时,我只需要一个泛型函数。我写了一个小的:
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
?)但这并不能解决第二个问题。我不是第一个想要(静态类型)泛型函数的人,但是我在任何地方都找不到任何好的资源。有什么建议吗?在
我猜你写的代码大概是这样的?在
实际上在运行时没有这个问题/mypy没有问题,但是pylint似乎不喜欢将“t”放在类定义的范围内。你可以做的是让派林特满意的是这样做:
^{pr2}$这与前一个代码片段完全等效,也将满足pylint。在
(作为一个切线,我认为皮林对前者不满意的事实实际上是一个缺陷。不过,公平地说,对于类型提示的最佳实践,目前还没有任何成熟的风格指南/在嵌套范围内放置typevar是一种不常见的用例,因此我想我不能真的责怪他们没有考虑到这种情况。)
唯一的缺点是,在外部使用TypeVar确实显得有些不整洁/似乎会污染全局命名空间。您可以通过将其重命名为
_T
来部分缓解这种情况,例如,将其重命名为私有的。当您需要另一个泛型类或函数时,也可以重用这个typevar,这也有助于减少命名空间污染。在有关在Python类型提示中使用泛型的详细信息,请参见http://mypy.readthedocs.io/en/stable/generics.html
相关问题 更多 >
编程相关推荐