[英]Mypy: annotating a variable with a class type
我在將Python 3.6類中的變量分配給特定類型(Pathlib路徑)時遇到了一些麻煩。 根據鏈接的示例,我嘗試創建一個TypeVar
,但mypy
仍然會拋出錯誤。 我想確保在__init__.py
初始化的類變量僅在編譯時接收特定類型。 所以這只是一個檢查,以確保我不會無意中為這些類變量設置字符串或其他東西。
任何人都可以建議正確的方法嗎?
這是一些簡單的代碼。
import pathlib
from typing import Union, Dict, TypeVar, Type
Pathtype = TypeVar('Pathtype', bound=pathlib.Path)
class Request:
def __init__(self, argsdict):
self._dir_file1: Type[Pathtype] = argsdict['dir_file1']
self._dir_file2: Type[Pathtype] = argsdict['dir_file2']
我得到的錯誤是:
Request.py:13: error: Invalid type "Request.Pathtype"
Request.py:14: error: Invalid type "Request.Pathtype"
Type,TypeVar和NewType都不正確。 你只想做的就是使用Path
本身:
from pathlib import Path
class Request:
def __init__(self, argsdict):
self._dir_file1: Path = argsdict['dir_file1']
self._dir_file2: Path = argsdict['dir_file2']
如果你將你的argsdict
注釋為類型為Dict[str, Path]
,你可以跳過必須完全注釋你的字段:mypy將推斷出正確的類型:
from typing import Dict
from pathlib import Path
class Request:
def __init__(self, argsdict: Dict[str, Path]):
self._dir_file1 = argsdict['dir_file1']
self._dir_file2 = argsdict['dir_file2']
以下是您嘗試使用/建議實際執行的各種類型構造的簡要說明:
當您嘗試創建通用數據結構或函數時,將使用TypeVar
。 例如,使用List[int]
,它表示包含int的列表。 List[...]
是通用數據結構的一個示例:它可以通過任意類型進行參數化 。
如果您決定要創建自己的通用數據結構,可以使用TypeVar
作為添加“可參數化孔”的方法。
編寫泛型函數時也可以使用TypeVars
。 例如,假設您要聲明您有一些可以接受任何類型值的函數 - 但該函數保證返回完全相同類型的值。 您可以使用TypeVars
表達這些TypeVars
。
Type[...]
注釋用於指示某個表達式必須是類型的類型。 例如,要聲明某個變量必須包含int,我們將編寫my_var: int = 4
。 但是如果我們想寫一些像my_var = int
東西呢? 我們可以給那個變量什么類型的提示? 在這種情況下,我們可以做my_var: Type[int] = int
。
NewType
基本上允許你“假裝”你正在使用某種類型並創建它的子類 - 但是不需要你在運行時實際上子類化任何東西。 如果您小心,您可以利用此功能來幫助捕獲混合不同“種類”的字符串或整數或其他內容的錯誤 - 例如,將表示HTML的字符串傳遞到期望表示SQL的字符串的函數中。
用NewType
替換TypeVar
並刪除Type[]
修飾符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.