2017-05-15 49 views
3

我想弄清楚什麼放在我的類型註釋在這個函數的頂部。Python類型暗示與curses

我有以下簡單的例子:

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) 

這將返回<type '_curses.curses window'>。這看起來好像不能和Type提示一起工作,因爲它有一個空格。 預計的結果將是 WindowObject列於 the documentation。我在curses模塊本身中找不到WindowObject的路徑。 編輯:這裏的文檔不正確。

如何用精確的類型註釋編寫main?

+2

只是不。 'WindowObject'是一個文檔錯誤;窗口對象類型的名稱是未記錄的,並且可能會更改,並且我認爲窗口對象類型甚至不可用作爲模塊屬性。 – user2357112

+0

Absolutamente right @ user2357112,type()方法總是告訴類型對象,不管它是什麼 –

+0

儘管這是一個奇怪的情況。我沒有看到一個類型(),其中有一個空格。打字庫如何處理這些?我並不是說我需要這樣做,但這是一個奇怪的例子。 – Technoloft

回答

2

不幸的是,curses模塊似乎並沒有完全鍵入在typeshed中。幾個月前有一些preliminary work done,但Windows對象尚未添加。您可以檢查自己的Python 3'curses'存根herehere

目前,該存根默認輸入curses.wrapper爲:

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

...這,反過來,相當於:

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

因此,這意味着,真的有沒有合適的鍵入以指定main函數的參數,除了Any之外。這就是說,如果你爲之奮鬥,你可能可以自己貢獻一些存根來完成curses這個模組!它似乎並不像Window object那樣非常複雜,而且應該有希望相對簡單。

主要的複雜情況可能是在確定'Window'對象應該從哪裏導入,如果它不存在於curses模塊本身中。您可能想要在typing模塊中粘貼「Windows」對象,就像typing.re.Pattern and typing.re.Match一樣。

+0

非常豐富。謝謝! – Technoloft

+0

我的拉取請求已被接受。 謝謝@ Michael0x2a https://github.com/python/typeshed/pull/1271 – Technoloft

1

您的問題是,您所觀察的類型不僅僅是對象的實際類型,方法類型()始終會正確告訴您類型,因此確保文檔。是錯的。

+0

這是有道理的,我已經更新了這個問題,但核心問題依然存在。 – Technoloft