Введіть підказку для файлу або файлоподібного об'єкта?


105

Чи існує якийсь правильний підказка щодо типу для файлу або файлоподібного об'єкта в Python? Наприклад, як би я ввів натяк на повернення значення цієї функції?

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

Відповіді:


144

Використовуйте typing.TextIOабо typing.BinaryIOтипи, або для файлів, відкритих у текстовому режимі або двійковому режимі відповідно.

З документів :

клас typing.IO

Обгортковий простір імен для типів потоків вводу-виводу.

Це визначає загальний тип IO[AnyStr]та псевдоніми, TextIOа також BinaryIOвідповідно IO[str]і IO[bytes]. Вони представляють типи потоків вводу-виводу, такі як повернуті open().


Загалом, можливо, набравши.IO як опис типу?
Yongwei Wu

2
Здається, жодне з них не працює для мене: def f() -> IO: return open('test')дає "Очікуваний тип" IO ", замість цього отримав" TextIOWrapper [str] '"у PyCharm.

@Marein про що IO[str]?
Уейн Вернер,

Те саме я боюся. Я також зауважую, що ітерація рядків у файлі дає "Очікуваний 'collection.iterable'".

1
Відтворено випуск @ Marein у спільноті PyCharm 2017.2: i.imgur.com/Ai4sVQl.jpg
Жан-Франсуа Корбетт

11

Коротка відповідь:

  • Вам потрібно бути чітким. Це from typing import TextIOне просто from 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.