簡體   English   中英

何時在 Python 類型提示中使用 IO[str]/IO[bytes] 和 TextIO/BinaryIO?

[英]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 類型提示的每種類型的正確情況是什么?

BinaryIOTextIO直接子類化IO[bytes]IO[str] ,並添加一些額外的方法——具體請參見typeshed中的定義。

因此,如果您需要這些額外的方法,請使用BinaryIO/TextIO 否則,最好使用IO[...]以獲得最大的靈活性。 例如,如果您將方法注釋為接受IO[str] ,則最終用戶提供該對象的實例會更容易一些。

盡管說了這么多,但目前的 IO 類總體上還是有些混亂:它們定義了許多並非所有函數都實際需要的方法。 因此,類型化維護者實際上正在考慮將 IO 類分解為更小的 Protocols 如果您願意,您也許可以這樣做。 如果您想定義自己的類似 IO 的類,但又不想承擔實現完整的typing.IO[...] API 的負擔,或者您正在使用一些幾乎是 IO 的類,則這種方法非常有用。喜歡,但不完全是。

BinaryIO/TextIO ,所有三種方法——使用BinaryIO/TextIOIO[...]或定義更緊湊的自定義協議——都是完全有效的。 如果 sphinx 擴展由於某種原因似乎無法處理一種特定的方法,那可能是他們的一個錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM