【问题标题】:Get python ellipsis (...) type without having to define it as `type(...)`获取 python 省略号 (...) 类型,而无需将其定义为 `type(...)`
【发布时间】:2021-06-12 14:49:04
【问题描述】:

有没有办法得到 python 的Ellipsis 类型?我看到执行type(Ellipsis) 和type(...) 返回<class 'ellipsis'>,但是通过编写x = ellipsis() 似乎ellipsis 不是默认定义的数据类型(NameError: name 'ellipsis' is not defined)。
我认为builtins 内置模块可以解决我的问题,但以下也会引发错误。

import builtins
_ellipsis = builtins.ellipsis    # AttributeError: module 'builtins' has no attribute 'ellipsis'

我真正需要的是做这样的事情:

from typing import Union

def f(x: Union[str, type(...)]):
    pass

显然以前的作品,但我想有一个更花哨的解决方案,只是type(...)

【问题讨论】:

    标签: python python-3.x ellipsis


    【解决方案1】:

    根据the documentation:

    Ellipsis

    与省略号文字“...”相同。特殊值主要与用户定义的容器数据类型的扩展切片语法结合使用。 Ellipsis 是 types.EllipsisType type 的唯一实例。

    因此,在 Python 3.10 (!) 中,您可以使用 types.EllipsisType 来表示这种类型。

    否则,您可以像这样定义自己的变量:

    EllipsisType = type(...)
    

    然后在类型声明中使用它

    【讨论】:

    • EllipsisType 在 Python 3.10 中似乎是新的 - 在你的回答中值得一提。
    • 我刚刚还发现了 Guido van rossum 自己的这个聪明的 hack github.com/python/typing/issues/684#issuecomment-548203158
    • 也许EllipsisType = type(builtins.Ellipsis) 更安全?
    • @Giuppox,有什么区别? builtins.Ellipsis 和 ... 实际上是一样的,不是吗? ... 只是语法糖。
    • 是的,但是如果变量Ellipsis 已被覆盖怎么办? builtins.Ellipsis 可以解决任何问题,不是吗?
    【解决方案2】:

    目前,你正在做的是实现它的唯一方法。

    在Python 3.10 中,它将在types 模块中可用。

    3.10 还在这里添加了NoneType 和NotImplementedType。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      • 2021-11-25
      • 1970-01-01
      • 2019-09-01
      • 1970-01-01
      • 2015-11-23
      • 1970-01-01
      相关资源
      最近更新 更多