พิมพ์คำใบ้สำหรับไฟล์หรือวัตถุคล้ายไฟล์?


116

มีคำใบ้ประเภทที่ถูกต้องสำหรับใช้กับไฟล์หรือวัตถุคล้ายไฟล์ใน Python หรือไม่ ตัวอย่างเช่นฉันจะพิมพ์คำใบ้ค่าส่งคืนของฟังก์ชันนี้ได้อย่างไร

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

คำตอบ:


160

ใช้อย่างใดอย่างหนึ่งtyping.TextIOหรือtyping.BinaryIOประเภทสำหรับไฟล์ที่เปิดในโหมดข้อความหรือโหมดไบนารีตามลำดับ

จากเอกสาร :

ชั้นเรียน typing.IO

Wrapper namespace สำหรับประเภทสตรีม I / O

นี้กำหนดประเภททั่วไปIO[AnyStr]และชื่อแทนTextIOและBinaryIOสำหรับตามลำดับและIO[str] IO[bytes]เหล่านี้เป็นตัวแทนของประเภทของ I / O open()ลำธารเช่นส่งกลับโดย


โดยทั่วไปอาจจะพิมพ์ IO เป็นคำอธิบายประเภท?
Yongwei Wu

2
สิ่งเหล่านี้ดูเหมือนจะไม่ได้ผลสำหรับฉัน: def f() -> IO: return open('test')ให้ "ประเภทที่คาดหวัง" IO "รับ" TextIOWrapper [str] "แทน" ใน PyCharm

@ มารินแล้วIO[str]ไง?
Wayne Werner

ฉันก็กลัวเหมือนกัน นอกจากนี้ฉันยังสังเกตเห็นว่าการทำซ้ำบนบรรทัดในไฟล์ทำให้ "คาดว่า" คอลเลกชั่นสามารถอ่านได้ ""

1
Reproduced @ Marein ฉบับในชุมชน PyCharm 2017.2: i.imgur.com/Ai4sVQl.jpg
Jean-François Corbett

15

คำตอบสั้น ๆ :

  • คุณต้องมีความชัดเจน นั่นคือไม่ได้เป็นเพียงfrom typing import TextIOfrom typing import *
  • ใช้IOเพื่อหมายถึงไฟล์โดยไม่ต้องระบุชนิด
  • ใช้TextIOหรือBinaryIOถ้าคุณรู้จักประเภท
  • ขณะนี้คุณไม่สามารถระบุได้ว่าจะเปิดเพื่อเขียนหรือเข้ารหัส

ตัวอย่างเช่น:

from typing import BinaryIO

def binf(inf: BinaryIO):
    pass

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

ให้ข้อผิดพลาดในการตรวจสอบ (ใน PyCharm) ของ Expected type 'BinaryIO', got 'TextIO' instead

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.