如何输入提示其值本身就是类型提示的变量?

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

我有一个函数,其参数之一预计是类型提示:类似

typing.List
、或
typing.List[int]
,甚至只是
int
。任何您合理期望看到的普通字段的类型注释。

这个参数的正确类型提示是什么?

(这里的上下文是我正在编写一个实用程序,该实用程序适用于使用类型注释定义字段的类,有点像数据类装饰器。)

python python-3.x type-hinting
2个回答
4
投票

几乎完整但可读性较差的答案:

type | types.GenericAlias | types.UnionType | typing._BaseGenericAlias | typing._SpecialForm

以下是我能想到的所有类型注释的可能性(在 Python 3.10 中):

  • 输入对象本身,如
    int
    list
    等。对应
    type
  • 标准集合中的类型提示泛型,例如
    list[int]
    。对应
    types.GenericAlias
  • 类型union,例如
    int | float
    (但
    typing.Union[int, float]
    不是,它对应于下一项)。对应
    types.UnionType
  • typing
    中的通用具体集合
    ,例如
    typing.List
    typing.List[int]
    等。这里我选择最先出现在其继承链中的公共基类
    typing._BaseGenericAlias
    。 (其实不仅是这些,
    typing
    中几乎所有可下标的注解类都继承自该类,包括
    typing.Literal[True]
    typing.Union[int, float]
    等)
  • 打字中的特殊打字原语,如
    typing.Any
    typing.NoReturn
    等。对应于
    typing._SpecialForm

需要注意的是,最后两种类型以下划线开头,表明它们是内部类型,不应该从

typing
导入和使用。然而,如果你坚持完全覆盖所有类型注释,它们应该是不可或缺的。


0
投票

继续@Mechanic Pig的回答(谢谢!),我创建了这个令人厌恶的东西,PyCharm和mypy(好吧,我用python 3.11 + mypy 1.4.1进行了测试)批准了:

from types import GenericAlias, UnionType
from typing import Any, Literal, TypeAlias

BaseGenericAlias: TypeAlias = type(Literal[0]).__base__.__base__  # type: ignore[name-defined]
SpecialForm: TypeAlias = type(Any)  # type: ignore[valid-type]
TypeHint: TypeAlias = (
    type  # type: ignore[valid-type]
    | GenericAlias
    | UnionType
    | BaseGenericAlias
    | SpecialForm
    | type(None)
)

# `type: ignore`s can be removed if mypy is not used
  • type(Literal[0]).__base__.__base__
    决心
    typing._BaseGenericAlias
  • type(Any)
    决心
    typing._SpecialForm

我还添加了

type(None)
,因为否则下面的代码片段将不起作用(真实的示例是函数的类型提示,不会返回任何内容):

assert isinstance(None, TypeHint)

整个事情都经过测试像这样,再次,python 3.11

将此留给任何未来“输入类型提示”的企业家,祝你好运

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