web-dev-qa-db-ja.com

Pythonで「ファイルタイプ」に注釈を付ける正しい方法

PEP 484 によると、Ppythonの最新バージョンでは、関数アノテーションを使用して静的型分析を行うことができます。これは、タイピングモジュールによって簡単になります。

今、私は「ファイルストリーム」に向けて「タイプヒント」をどのように与えるのだろうかと思っています。

_def myfunction(file: FILETYPE):
    pass

with open(fname) as file:
    myfunction(file)
_

FILETYPEとして何を挿入しますか?

print(type(file))を使用すると_<class '_io.TextIOWrapper'>_が返されますが、これは明確ではありません。

一般的な「ファイル」タイプはありませんか?

19
paul23

io.IOBase 、 "バイトストリームに作用するすべてのI/Oクラスの抽象基本クラス。"

これには、io.StringIOio.BytesIOなどのメモリ内ストリームも含まれることに注意してください。詳細は module io のドキュメントを参照してください。

8
Goyo

_typing.IO_、_typing.TextIO_、および_typing.BinaryIO_を使用して、さまざまなタイプのI/Oストリームを表すことができます。 documentation を引用するには:

クラスタイピング。io

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

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

これらの型には、_typing.IO_、_typing.TextIO_、および
_typing.BinaryIO_。

11
Eugene Yarmash

これのどちらか:

from typing import TextIO # or IO or BinaryIO

def myfunction(file: TextIO ):
    pass

[〜#〜]または[〜#〜] this

from typing import TYPE_CHECKING
if TYPE_CHECKING:
    from typing import TextIO # or IO or BinaryIO

def myfunction(file: 'TextIO'):
    pass

2番目の方法では、実行中にクラスをインポートしません。 pythonは実行中にTYPE_CHECKINGをインポートする必要がありますが、型ヒントのみのクラスをインポートしないことをお勧めします:(1)は実行されません(解析されるだけです) 、および(2)循環インポートを回避できます

4
toto_tico