我想定义一个像这样的NewType:
基本上,我希望以后可以将原始路径“str”或“pathlib.Path”传递给函数,并且它们可以强制执行这是特定于“Repo”的路径,而不是随机路径。这很有用,因为我的代码中有很多路径和url等,我不想让它们混淆(我也不想使用(应用程序)匈牙利符号)。是否有一种好的方法让类型检查器为我完成这个任务?
from typing import NewType
from os import PathLike
AnyPath = PathLike[str] | str
RepoPath = NewType("RepoPath", AnyPath) # ERR: Argument 2 to NewType(...) must be subclassable (got "Union[PathLike[str], str]")
# RepoPath = NewType("RepoPath", PathLike[str]) # ERR: NewType cannot be used with protocol classes
基本上,我希望以后可以将原始路径“str”或“pathlib.Path”传递给函数,并且它们可以强制执行这是特定于“Repo”的路径,而不是随机路径。这很有用,因为我的代码中有很多路径和url等,我不想让它们混淆(我也不想使用(应用程序)匈牙利符号)。是否有一种好的方法让类型检查器为我完成这个任务?
Union
不是一个好选择? - C.NivsAnyPath = PathLike[str] | str = Union[PathLike[str], str]
。但如果我创建一个函数def foo(repo: AnyPath): ...
,那么我不能保证repo
是指向 Repo 的路径,它可能只是一个编程错误,一些在此上下文中没有意义的路径(或字符串)。NewType 在调用函数时使其明确,您正在传递一个标记为“RepoPath”的 str/PathLike,因此不太可能是编程错误。与safe_str=escape(unsafe_str)
相同-两者都是字符串,但具有不同的含义。 - GreedoNewType
接受一个可调用对象作为其第二个参数,而这不是您代码中发生的情况。 - C.Nivspathlib.Path
但不允许os.PathLike
。 - GreedoNewType
时,曾经讨论过允许基于联合类型和类似的类型创建NewType
。然而,这个想法被放弃了,现在要求NewType
必须基于“类似类”的对象。 - Carl