Python 来自私有导入的类型注释(来自 curses)
Python type annotations from private imports (from curses)
我刚开始使用类型注释,在使用 Python 中的 curses
模块时遇到了问题。更具体地说,curses.wrapper(func)
期望一个函数 func
作为参数,以一个主函数 window,也称为 "stdscr" 作为参数。但是,我不确定如何注释这样的函数。例如
from curses import wrapper
def interactive_shell_curses(stdscr: _curses.window) -> None:
产生错误 "Name '_curses' is not defined" 即使 print(type(stdscr))
打印 <class '_curses.window'>
。 _curses.window
可在来自 typeshed 的文件 _curses.pyi
中找到。但是,我不确定如何导入它,或者我是否应该导入它。另外,我不确定这里的最佳实践是否真的只是避免注释 interactive_shell_curses
.
请指教如何处理!
Python curses
模块只是 curses
库的包装器。特别是这意味着您将无法出于键入目的访问 window 对象(_curses.window
仅在调用 initscr()
后可用,即使可以,它也将是非常无用,因为库本身不提供类型提示)。
另一方面,您不能只从 typeshed
的 _curses.pyi
导入 _CursesWindow
类型提示,因为它不是在运行时定义的。这是 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)
我刚开始使用类型注释,在使用 Python 中的 curses
模块时遇到了问题。更具体地说,curses.wrapper(func)
期望一个函数 func
作为参数,以一个主函数 window,也称为 "stdscr" 作为参数。但是,我不确定如何注释这样的函数。例如
from curses import wrapper
def interactive_shell_curses(stdscr: _curses.window) -> None:
产生错误 "Name '_curses' is not defined" 即使 print(type(stdscr))
打印 <class '_curses.window'>
。 _curses.window
可在来自 typeshed 的文件 _curses.pyi
中找到。但是,我不确定如何导入它,或者我是否应该导入它。另外,我不确定这里的最佳实践是否真的只是避免注释 interactive_shell_curses
.
请指教如何处理!
Python curses
模块只是 curses
库的包装器。特别是这意味着您将无法出于键入目的访问 window 对象(_curses.window
仅在调用 initscr()
后可用,即使可以,它也将是非常无用,因为库本身不提供类型提示)。
另一方面,您不能只从 typeshed
的 _curses.pyi
导入 _CursesWindow
类型提示,因为它不是在运行时定义的。这是 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)