python - 来自私有导入的 Python 类型注解(来自 curses)
问题描述
curses
我刚开始使用类型注释,在 Python 中使用该模块时遇到了问题。更具体地说,curses.wrapper(func)
期望一个函数作为参数func
,将主窗口(也称为“stdscr”)作为参数。但是,我不确定如何注释这样的函数。例如
from curses import wrapper
def interactive_shell_curses(stdscr: _curses.window) -> None:
产生错误“名称'_curses'未定义”即使print(type(stdscr))
打印<class '_curses.window'>
。在typeshed_curses.window
的文件中找到。_curses.pyi
但是,我不确定如何导入它,或者我是否应该导入它。另外,我不确定这里的最佳实践是否实际上是避免注释interactive_shell_curses
.
请指教如何处理这种情况!
解决方案
Pythoncurses
模块只是curses
库的包装器。特别是这意味着您将无法访问 window 对象以进行输入(_curses.window
仅在调用 后才可用initscr()
,即使可以,它也将毫无用处,因为库本身不提供类型提示)。
另一方面,您不能只从's导入_CursesWindow
类型提示,因为它不是在运行时定义的。这就是常量可以提供帮助的地方。如果是,则您处于类型检查模式并从存根导入类型提示。否则,您正在使用不关心类型提示的解释器运行代码,因此例如使用类型。例子:typeshed
_curses.pyi
TYPE_CHECKING
TYPE_CHECKING
True
Any
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)
推荐阅读
- heroku - 使用烧瓶后,Apache2 不再可以在 localhost 之外访问
- angular - 直接绑定到 Angular 中的属性
- tensorflow - 在 Pascal VOC 指标中,错误标记的框是假阳性吗?
- database - 自上一个提交点和提交点之前的更新
- php - 如果术语类别 + 是可变的 WooCommerce,则尝试更改购买按钮文本
- javascript - 对 html 元素的 javascript 样式属性有问题
- java - 如何在没有硬编码问题的情况下使用 ListView 巧妙地编程我的应用程序
- javascript - 调整规则以从不同的 firebase 项目访问项目
- python - Python:这段代码中的“而不是”是什么意思
- asp.net-core - ASP.NET Core 2.2 PWA 离线