簡體   English   中英

Mypy:用類類型注釋變量

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

以下是您嘗試使用/建議實際執行的各種類型構造的簡要說明:

  1. 當您嘗試創建通用數據結構或函數時,將使用TypeVar 例如,使用List[int] ,它表示包含int的列表。 List[...]是通用數據結構的一個示例:它可以通過任意類型進行參數化

    如果您決定要創建自己的通用數據結構,可以使用TypeVar作為添加“可參數化孔”的方法。

    編寫泛型函數時也可以使用TypeVars 例如,假設您要聲明您有一些可以接受任何類型值的函數 - 但該函數保證返回完全相同類型的值。 您可以使用TypeVars表達這些TypeVars

  2. Type[...]注釋用於指示某個表達式必須是類型的類型。 例如,要聲明某個變量必須包含int,我們將編寫my_var: int = 4 但是如果我們想寫一些像my_var = int東西呢? 我們可以給那個變量什么類型的提示? 在這種情況下,我們可以做my_var: Type[int] = int

  3. NewType基本上允許你“假裝”你正在使用某種類型並創建它的子類 - 但是不需要你在運行時實際上子類化任何東西。 如果您小心,您可以利用此功能來幫助捕獲混合不同“種類”的字符串或整數或其他內容的錯誤 - 例如,將表示HTML的字符串傳遞到期望表示SQL的字符串的函數中。

NewType替換TypeVar並刪除Type[]修飾符。

暫無
暫無

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

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