Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python Type hinting with curses

Tags:

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?

like image 466
Technoloft Avatar asked May 15 '17 20:05

Technoloft


2 Answers

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.

like image 53
Michael0x2a Avatar answered Sep 25 '22 10:09

Michael0x2a


Your problem is that the type you spect is just not the real type of the object, the method type() always tells you the type correctly, so by sure the doc. is wrong.

like image 29
A Monad is a Monoid Avatar answered Sep 21 '22 10:09

A Monad is a Monoid