[英]Python mypy Type Hinting shutil.copyfileobj() has incompatible type “Union[HTTPResponse, BinaryIO]”; expected IO[Any]
[英]When to use IO[str]/IO[bytes] and TextIO/BinaryIO in Python type hinting?
從文檔中,它說:
通用類型
IO[AnyStr]
及其子類TextIO(IO[str])
和BinaryIO(IO[bytes])
表示 I/O 流的類型,例如open()
返回的類型。— Python 文檔:
typing.IO
文檔沒有指定何時使用BinaryIO
/ TextIO
而不是IO[str]
和IO[bytes]
。
通過對 Python Typeshed 源代碼的簡單檢查,在搜索BinaryIO
時只找到了30 個命中,而IO[bytes]
找到了109 個命中。
我試圖從IO[bytes]
切換到BinaryIO
以更好地與sphinx-autodoc-typehints兼容,但切換破壞了許多類型檢查,因為像tempfile.NamedTemporaryFile
這樣的方法被輸入為IO[bytes]
而不是另一個。
從設計角度來說,使用這些 IO 類型提示的每種類型的正確情況是什么?
BinaryIO
和TextIO
直接子類化IO[bytes]
和IO[str]
,並添加一些額外的方法——具體請參見typeshed中的定義。
因此,如果您需要這些額外的方法,請使用BinaryIO/TextIO
。 否則,最好使用IO[...]
以獲得最大的靈活性。 例如,如果您將方法注釋為接受IO[str]
,則最終用戶提供該對象的實例會更容易一些。
盡管說了這么多,但目前的 IO 類總體上還是有些混亂:它們定義了許多並非所有函數都實際需要的方法。 因此,類型化維護者實際上正在考慮將 IO 類分解為更小的 Protocols 。 如果您願意,您也許可以這樣做。 如果您想定義自己的類似 IO 的類,但又不想承擔實現完整的typing.IO[...]
API 的負擔,或者您正在使用一些幾乎是 IO 的類,則這種方法非常有用。喜歡,但不完全是。
BinaryIO/TextIO
,所有三種方法——使用BinaryIO/TextIO
、 IO[...]
或定義更緊湊的自定義協議——都是完全有效的。 如果 sphinx 擴展由於某種原因似乎無法處理一種特定的方法,那可能是他們的一個錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.