簡體   English   中英

python中泛型函數的最佳實踐

[英]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'

所以我覺得我做錯了,我可以改變變量名( 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM