繁体   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