2017-05-15 47 views
3

我想弄清楚什么放在我的类型注释在这个函数的顶部。Python类型暗示与curses

我有以下简单的例子:

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'>。这看起来好像不能和Type提示一起工作,因为它有一个空格。 预计的结果将是 WindowObject列于 the documentation。我在curses模块本身中找不到WindowObject的路径。 编辑:这里的文档不正确。

如何用精确的类型注释编写main?

+2

只是不。 'WindowObject'是一个文档错误;窗口对象类型的名称是未记录的,并且可能会更改,并且我认为窗口对象类型甚至不可用作为模块属性。 – user2357112

+0

Absolutamente right @ user2357112,type()方法总是告诉类型对象,不管它是什么 –

+0

尽管这是一个奇怪的情况。我没有看到一个类型(),其中有一个空格。打字库如何处理这些?我并不是说我需要这样做,但这是一个奇怪的例子。 – Technoloft

回答

2

不幸的是,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): ... 

因此,这意味着,真的有没有合适的键入以指定main函数的参数,除了Any之外。这就是说,如果你为之奋斗,你可能可以自己贡献一些存根来完成curses这个模组!它似乎并不像Window object那样非常复杂,而且应该有希望相对简单。

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

+0

非常丰富。谢谢! – Technoloft

+0

我的拉取请求已被接受。 谢谢@ Michael0x2a https://github.com/python/typeshed/pull/1271 – Technoloft

1

您的问题是,您所观察的类型不仅仅是对象的实际类型,方法类型()始终会正确告诉您类型,因此确保文档。是错的。

+0

这是有道理的,我已经更新了这个问题,但核心问题依然存在。 – Technoloft