【问题标题】:python: annotation for ellipsis to be a possible argument of a functionpython:省略号的注释是函数的可能参数
【发布时间】:2022-01-24 19:48:27
【问题描述】:

出于“某些原因”,我想允许 python 的省略号“...”(也)作为某个函数(比如说)f 的参数,例如如下:

def f(arg: ?) -> None:
    print(arg)

f(...)

我应该为 arg 使用什么注释?

【问题讨论】:

  • 请详细说明“一定的原因”
  • 这里有很多不必要的上下文。如果我对 f(5) 编码然后是“arg: int”,或者如果我对 f('barfoo') 编码然后是“arg:str”,即对于应该进入 f 的任何内容都有一个相应的类型注释。但是,当参数既不是整数也不是字符串,而是省略号时,我应该使用什么类型注释?
  • pycharm 似乎接受“type(Ellipsis)”,即“def f(arg: type(Ellipsis)):”。但是我怀疑这是正确的解决方案。

标签: python annotations ellipsis


【解决方案1】:

...Ellipsis 类的一个实例,因此您可以执行以下操作:

def f(arg:Ellipsis) -> None:
    # your code

由于该类只有一个实例,您可能希望将其与其他一些类型结合使用。否则为什么根本没有参数(这可能是一种通过临时设置不可用类型来检测对函数f的所有调用的方法)

【讨论】:

  • 感谢您的回答。我还没有用 mypy 进行检查,但是 pycharm 从“arg:Ellipsis”推断出 arg 可能是“Any”。相反,当我写“arg: type(Ellipsis)”时,pycharm 推断正确。我不确定这是否是 pycharm 特定的错误/功能。
【解决方案2】:

看起来(参见 python 文档:https://docs.python.org/3/library/constants.html#Ellipsis

from types import EllipsisType

def f(arg: EllipsisType):
    print(arg)

f(...)  # or alternatively f(Ellipsis)

这里是正确的解决方案(即注释省略号本身)

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
  • 根据机器人的建议编辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
相关资源
最近更新 更多