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