我在将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']
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
Request.py:13: error: Invalid type "Request.Pathtype"
Request.py:14: error: Invalid type "Request.Pathtype"
Run Code Online (Sandbox Code Playgroud)
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']
Run Code Online (Sandbox Code Playgroud)
如果您将注释argsdict为type 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']
Run Code Online (Sandbox Code Playgroud)
这是对您试图使用/建议使用的各种类型构造实际做什么的简要说明:
TypeVar在尝试创建通用数据结构或函数时使用。例如,take List[int],它表示包含整数的列表。List[...]是通用数据结构的一个示例:可以通过任何任意类型进行参数化。
TypeVar如果您决定要创建自己的通用数据结构,则可以使用它来添加“可参数化的漏洞”。
TypeVars编写泛型函数时也可以使用。例如,假设您要声明自己具有一些可以接受任何类型值的函数,但是可以保证该函数返回完全相同类型的值。您可以使用来表达类似的想法TypeVars。
该Type[...]注释被用于指示一些表达式必须是一个类型的类型。例如,要声明某个变量必须包含一个int,我们可以编写my_var: int = 4。但是,如果我们想写类似的东西my_var = int怎么办?我们可以给该变量什么样的类型提示?在这种情况下,我们可以做my_var: Type[int] = int。
NewType基本上可以让您“假装”您正在采用某种类型并对其进行子类化-但无需在运行时实际子类化。如果您小心一点,则可以利用此功能来帮助在混合不同类型的字符串或整数或其他类型的错误时捕获错误-例如,将表示HTML的字符串传递给需要表示SQL的字符串的函数。
| 归档时间: |
|
| 查看次数: |
552 次 |
| 最近记录: |