[英]Best practices for generic functions in 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'
所以我覺得我做錯了,我可以改變變量名( ttt
? typ
?),但這不能解決第二個問題。 我不能成為第一個想要(靜態類型)泛型函數的人,但我無法在任何地方找到任何好的資源。 有什么建議?
我猜你寫的代碼大概是這樣的?
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.