ファイルまたはファイルのようなオブジェクトのヒントを入力しますか?


106

Pythonのファイルまたはファイルのようなオブジェクトに使用する正しい型のヒントはありますか?たとえば、この関数の戻り値をどのように入力するのでしょうか。

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

回答:


145

テキストモードまたはバイナリモードで開かれたファイルには、それぞれtyping.TextIOまたはtyping.BinaryIOタイプを使用します。

ドキュメントから:

クラス typing.IO

I / Oストリームタイプのラッパー名前空間。

これは、ジェネリック型IO[AnyStr]とエイリアスTextIO、およびBinaryIOそれぞれIO[str]とを定義しますIO[bytes]。これらは、によって返されるなどのI / Oストリームのタイプを表しopen()ます。


一般的に、タイプの説明としてtyping.IO?
Yongwei Wu 2017

2
これらのどれも私def f() -> IO: return open('test')にはうまくいかないようです:PyCharmで「期待されるタイプ 'IO'、代わりに 'TextIOWrapper [str]'を取得しました」。

@マレインはどうIO[str]ですか?
ウェインウェルナー

同じことを私は恐れています。また、ファイル内の行を反復処理すると、「Expected'collections.iterable '」が得られることにも気づいています。

1
PyCharmコミュニティ2017.2で@Marein
-FrançoisCorbett

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.