Mypy:用类类型注释变量

问题描述 投票:2回答:2

我在将Python 3.6类中的变量分配给特定类型(Pathlib路径)时遇到了一些麻烦。根据link的一个例子,我试图创建一个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"
python-3.x mypy
2个回答
2
投票

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

如果你注释你的argsdictDict[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],它表示包含整数的列表。 List[...]是通用数据结构的一个示例:它可以通过任意类型进行参数化。 如果您决定要创建自己的通用数据结构,可以使用TypeVar作为添加“可参数化漏洞”的方法。 在编写泛型函数时也可以使用TypeVars。例如,假设您要声明您有一些可以接受任何类型值的函数 - 但该函数保证返回完全相同类型的值。你可以使用TypeVars表达这些想法。
  2. Type[...]注释用于指示某些表达式必须是类型的类型。例如,要声明某个变量必须包含int,我们将编写my_var: int = 4。但是,如果我们想写像my_var = int这样的东西呢?我们可以给那个变量什么类型的提示?在这种情况下,我们可以做my_var: Type[int] = int
  3. NewType基本上允许你“假装”你正在使用某种类型并创建它的子类 - 但是不需要你在运行时实际上子类化任何东西。如果你小心,你可以利用这个功能来帮助捕捉你混合不同“种类”的字符串或整数或其他任何东西的错误 - 例如将表示HTML的字符串传递给期望表示SQL的字符串的函数。

1
投票

TypeVar替换NewType并删除Type[]修饰符。

© www.soinside.com 2019 - 2024. All rights reserved.