2017-05-15 3 views
3

Ich versuche herauszufinden, was in meinem Typ Annotation am Anfang dieser Funktion zu setzen.Python Typ Hinting mit Flüche

Ich habe folgendes triviales Beispiel:

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) 

Das gibt <type '_curses.curses window'>. Dies scheint nicht so zu sein, dass es mit Type-Hinting funktioniert, da es Leerzeichen enthält. Das erwartete Ergebnis wäre WindowObject aufgeführt in the documentation. Ich kann keinen Pfad zu WindowObject in dem Curses-Modul selbst finden. EDIT: Die Dokumentation ist hier falsch.

Wie schreibe ich main mit genauen type annotation?

+2

Nur nicht. 'WindowObject' ist ein Dokumentationsfehler; Der Name des Fensterobjekttyps ist undokumentiert und kann sich ändern, und ich glaube nicht, dass der Fensterobjekttyp sogar als Modulattribut verfügbar ist. – user2357112

+0

Absolutamente rechts @ user2357112, type() -Methode sagt immer dem Typ Objekt, egal was –

+0

Dies ist ein seltsamer Fall obwohl. Ich habe keinen Typ() mit einem Leerzeichen darin gesehen. Wie geht die Typing-Bibliothek damit um? Ich sage nicht, dass ich es tun muss, aber das ist ein seltsamer Fall. – Technoloft

Antwort

2

Leider scheint das Curses-Modul nicht vollständig in typeshed getippt zu sein. Vor einigen Monaten gab es einige preliminary work done, aber das Windows-Objekt wurde noch nicht hinzugefügt. Sie können die Python 3 'Curses' Stubs selbst überprüfen here und here.

Derzeit ist die Stubs Standard curses.wrapper zu eingeben:

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

... was wiederum ist äquivalent zu:

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

So bedeutet das, dass es wirklich keine geeignet ist Geben Sie den zu diesem Zeitpunkt zugewiesenen main Funktionsparameter ein, mit Ausnahme von Any.

Das heißt, wenn Sie dafür bereit sind, können Sie einige Stubs beitragen, um das curses Modul selbst zu vervollständigen! Es scheint nicht, dass die Window object ist schrecklich komplex und sollte hoffentlich relativ einfach zu tippen sein.

Die Hauptkomplikation könnte darin bestehen, herauszufinden, wo genau das 'Window'-Objekt importiert werden soll, wenn es nicht innerhalb des Curses-Moduls selbst existiert. Vielleicht möchten Sie das "Windows" -Objekt innerhalb des typing-Moduls selbst stecken, genau wie typing.re.Pattern and typing.re.Match.

+0

Sehr informativ. Vielen Dank! – Technoloft

+0

Meine Pull-Anfrage wurde nur angenommen. Vielen Dank @ Michael0x2a https://github.com/python/typeshed/pull/1271 – Technoloft

1

Ihr Problem ist, dass der Typ, den Sie sehen, nicht nur der reale Typ des Objekts ist, die Methode type() sagt Ihnen immer den Typ korrekt, also sicher das Dokument. ist falsch.

+0

Das macht Sinn Ich habe die Frage aktualisiert, aber die Kernfrage bleibt. – Technoloft