• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

Python中泛型函数的最佳实践

python 来源:McKay 6次浏览

我读了很多关于泛型类的内容,虽然这些类很酷,但有时候我只需要一个泛型函数。这是我写的一个小的:Python中泛型函数的最佳实践

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

这是怎么被注释的类型。在与通用支持静态类型语言,我会写这样的事情

private Dictionary<KeyType, ValueType> matrix; 
private Dictionary<KeyType, T> matrix_map<T>(Func<ValueType, T>) 

所以,我想我会写这样的:

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' 

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


===========解决方案如下:

我猜你写的代码看起来大致是这样吗?

class Matrix: 
    T = TypeVar('T') 

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

实际上,有没有问题,这个在运行时mypy /没有问题,但似乎pylint的不幸福跟你把那个“T”类定义的范围内。你可以做什么来满足pylint的是不是这样做:

T = TypeVar('T') 

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

这是完全等同于以前的代码片段,也将满足pylint的。 (作为一个相切点,我认为pylint对前者不满意的事实实际上是一个错误。但公平地说,对于类型提示的最佳实践并没有真正的建立风格指南然而,将一个typevar放在嵌套的作用域内是一个不常见的用例,所以我想我不能指责他们不考虑这种情况。)

唯一的缺点是在外部有TypeVar看起来似乎含糊不清/看起来会污染全局命名空间。例如,您可以通过将其重命名为_T等来部分缓解此问题,以表明它是私密的。当你需要另一个泛型类或函数时,你也可以重用这个类型变量,这也应该有助于减少名称空间的污染。

有关使用泛型与Python类型提示的更多信息,请参阅http://mypy.readthedocs.io/en/stable/generics.html


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)