【问题标题】:Python Type hinting with curses带有诅咒的 Python 类型提示
【发布时间】:2017-10-14 18:18:25
【问题描述】:

我正在尝试找出在此函数顶部的类型注释中放入什么内容。

我有以下简单的例子:

import curses

def main(stdscr):
    stdscr.clear()

    stdscr.addstr(2, 0, "What is the type of stdscr?")
    stdscr.addstr(5, 0, "It is: {}".format(type(stdscr)))

    stdscr.refresh()
    stdscr.getkey()

curses.wrapper(main)

这将返回<type '_curses.curses window'>。这似乎不适用于类型提示,因为它有一个空格。 预期结果将是the documentation 中列出的WindowObject。我在 curses 模块本身中找不到 WindowObject 的路径。 编辑:这里的文档不正确。

如何编写带有准确类型注释的 main?

【问题讨论】:

  • 别这样。 WindowObject 是文档错误;窗口对象类型的名称没有记录并且可能会更改,而且我认为窗口对象类型甚至不能作为模块属性使用。
  • 绝对正确@user2357112,type() 方法总是告诉类型对象,无论如何
  • 这是一个奇怪的案例。我还没有看到里面有空格的 type() 。 Typing 库如何处理这些?我并不是说我需要这样做,但这是一个奇怪的案例。

标签: python python-3.5 python-3.6 type-hinting python-curses


【解决方案1】:

不幸的是,curses 模块似乎没有在 typeshed 中完全输入。几个月前有一些preliminary work done,但还没有添加Windows对象。您可以自己检查 Python 3 'curses' 存根 herehere

目前,存根默认将curses.wrapper 键入为:

def wrapper(func, *args, **kwds): ...

...这又相当于:

def wrapper(func: Callable[..., Any], *args: Any, **kwds: Any): ...

因此,这意味着除了Any 之外,目前确实没有合适的类型可以分配给main 函数的参数。

也就是说,如果您愿意,您也许可以贡献一些存根来自己完成curses 模块! Window object 似乎并没有那么复杂,并且希望输入起来相对简单。

如果 'Window' 对象在 curses 模块本身中不存在,主要的复杂性可能是确定应该从哪里导入。您可能希望将“Windows”对象粘贴到 typing 模块本身中,就像 typing.re.Pattern and typing.re.Match 一样。

【讨论】:

【解决方案2】:

您的问题是您指定的类型不是对象的真实类型,方法 type() 总是正确地告诉您类型,因此请确保文档。是错的。

【讨论】:

  • 这是有道理的,我已经更新了问题,但核心问题仍然存在。
猜你喜欢
  • 2010-09-24
  • 1970-01-01
  • 2012-04-08
  • 2014-04-23
  • 1970-01-01
  • 2013-11-22
  • 2017-03-19
  • 2020-09-09
  • 2018-02-27
相关资源
最近更新 更多