Gõ gợi ý cho một tệp hoặc đối tượng giống tệp?


106

Có gợi ý loại chính xác nào để sử dụng cho tệp hoặc đối tượng giống tệp trong Python không? Ví dụ, làm cách nào để gõ-gợi ý giá trị trả về của hàm này?

def foo():
    return open('bar')

Câu trả lời:


145

Sử dụng một trong hai typing.TextIOhoặc typing.BinaryIOcác loại, cho các tập tin đã mở trong chế độ văn bản hoặc chế độ nhị phân tương ứng.

Từ các tài liệu :

lớp học typing.IO

Không gian tên gói cho các loại luồng I / O.

Điều này xác định loại chung IO[AnyStr]và bí danh TextIOBinaryIOcho tương ứng IO[str]IO[bytes]. Chúng đại diện cho các loại luồng I / O chẳng hạn như được trả về bởi open().


Nói chung, có thể gõ.IO làm mô tả loại?
Yongwei Wu

2
Không có cái nào trong số này dường như hiệu quả với tôi: def f() -> IO: return open('test')đưa ra "Loại mong đợi là 'IO', thay vào đó là 'TextIOWrapper [str]'" trong PyCharm.

@Marein thì IO[str]sao?
Wayne Werner

Tôi cũng sợ. Tôi cũng nhận thấy rằng việc lặp lại các dòng trong một tệp sẽ cho kết quả "Dự kiến ​​là 'collection.iterable'".

1
Sao chép @ vấn đề Marein trong PyCharm cộng 2017,2: i.imgur.com/Ai4sVQl.jpg
Jean-François Corbett

11

Câu trả lời ngắn gọn:

  • Bạn cần phải rõ ràng. Đó from typing import TextIOkhông chỉ là from typing import *.
  • Sử dụng IOnghĩa là một tệp mà không chỉ định loại
  • Sử dụng TextIOhoặc BinaryIOnếu bạn biết loại
  • Bạn hiện không thể chỉ định nó được mở để ghi hay mã hóa nó.

Ví dụ:

from typing import BinaryIO

def binf(inf: BinaryIO):
    pass

with open('x') as f:
    binf(f)

đưa ra lỗi kiểm tra (trong PyCharm) Expected type 'BinaryIO', got 'TextIO' instead

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.