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