Search code examples
pythonpython-3.5python-3.6type-hintingpython-curses

Python Type hinting with curses


I'm trying to figure out what to put in my type annotation at the top of this function.

I have the following trivial example:

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)

This returns <type '_curses.curses window'>. This doesn't seem like it will work with Type hinting as it has a space in it. The expected result would be WindowObject listed in the documentation. I can't find a path to WindowObject in the curses module itself. EDIT: The documentation is incorrect here.

How do I write main with accurate type annotation?


Solution

  • Unfortunately, the curses module does not appear to be fully typed within typeshed. There was some preliminary work done a few months ago, but the Windows object has not been added yet. You can check the Python 3 'curses' stubs for yourself here and here.

    Currently, the stubs default to typing curses.wrapper as:

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

    ...which, in turn, is equivalent to:

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

    So, that means that there really is no suitable type to assign to your main function's parameter at the moment, apart from Any.

    That said, if you're up for it, you might be able to contribute some stubs to complete the curses module yourself! It doesn't seem like the Window object is that terribly complex and should hopefully be relatively straightforward to type.

    The main complication might be hammering out where exactly the 'Window' object should be imported from, if it doesn't exist within the curses module itself. You might perhaps want to stick the 'Windows' object within the typing module itself, just like typing.re.Pattern and typing.re.Match.