首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自私有导入的Python类型注释(来自curses)

来自私有导入的Python类型注释(来自curses)
EN

Stack Overflow用户
提问于 2020-03-08 20:56:06
回答 1查看 432关注 0票数 3

我刚开始使用类型注释,在使用Python语言中的curses模块时遇到了一个问题。更具体地说,curses.wrapper(func)期望以主窗口(也称为"stdscr“)作为参数的函数func。然而,我不确定如何注释这样的函数。例如

代码语言:javascript
复制
from curses import wrapper

def interactive_shell_curses(stdscr: _curses.window) -> None:

即使print(type(stdscr))打印<class '_curses.window'>,也会产生错误"Name '_curses‘is not defined“。可以在typeshed的文件_curses.pyi中找到_curses.window。然而,我不确定如何导入它,或者我是否应该导入它。此外,我不确定这里的最佳实践是否真的是不对interactive_shell_curses进行注释。

请建议如何处理这种情况!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-08 23:41:47

Python curses模块只是curses库的包装器。特别是,这意味着您将无法访问用于键入目的的window对象(_curses.window只有在调用initscr()之后才可用,即使它可以,它也是非常无用的,因为库本身不提供类型提示)。

另一方面,你不能只从typeshed_curses.pyi导入_CursesWindow类型提示,因为它不是在运行时定义的。这就是TYPE_CHECKING常量可以提供帮助的地方。如果TYPE_CHECKINGTrue,则你处于类型检查模式并从存根导入类型提示。否则,你正在使用不关心类型提示的解释器运行代码,因此例如使用Any类型。示例:

代码语言:javascript
复制
import curses
from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from _curses import _CursesWindow
    Window = _CursesWindow
else:
    from typing import Any
    Window = Any


def main(stdscr: Window) -> None:
    height, width = stdscr.getmaxyx()
    text = 'Hello world'
    stdscr.addstr(int(height / 2), int((width - len(text)) / 2), text)

    key = 0
    while (key != ord('q')):
        stdscr.refresh()
        key = stdscr.getch()
    return None


if __name__ == '__main__':
    curses.wrapper(main)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60587680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档