14

関数が入力としてテキスト ファイルの名前を受け取る場合、代わりにファイル オブジェクトを受け取るようにリファクタリングできます (私はそれを「ストリーム」と呼んでいます。より適切な言葉はありますか?)。利点は明らかです。ストリームを引数として取る関数は次のとおりです。

  • テストのためだけに一時ファイルを作成する必要がないため、単体テストを作成するのがはるかに簡単になります。
  • ファイルの内容を変数にすでに持っている状況で使用できるため、より柔軟です。

ストリームに不利な点はありますか? それとも、常に関数をファイル名引数からストリーム引数にリファクタリングする必要がありますか (もちろん、ファイルがテキストのみであると仮定します)。

4

2 に答える 2

7

...xml.etree.ElementTreeモジュールがparse関数を実装する方法は次のとおりです。

def parse(self, source, parser=None):
    close_source = False
    if not hasattr(source, "read"):
        source = open(source, "rb")
        close_source = True
    ...

filename は文字列であるため、メソッドはありませんread()(ここでは、その名前の属性がチェックされます)。ただし、開いているファイルにはそれがあります。この 4 行により、残りのコードは共通になります。唯一の複雑な点は、ファイル オブジェクト (ここでは という名前) を閉じるかどうかを覚えておく必要があることですsource。内部にある場合はopen、閉じている必要があります。それ以外の場合は、閉じてはなりません。

実際には、ファイルはストリームとは少し異なります。ストリームは潜在的に無限ですが、ファイルは通常そうではありません (一部のデバイスがファイルであるかのようにマップされない限り)。処理時の重要な違いは、ストリームを一度にメモリに読み込むことができないことです。チャンクで処理する必要があります。

于 2012-09-25T21:50:34.203 に答える
4

ファイル名または開いているファイルオブジェクトである文字列の両方を受け入れるpython標準ライブラリには多数の関数があります(これを「ストリーム」と呼んでいると思います)。関数がいずれかを受け入れるようにするために使用できるデコレーターを作成することは、実際には難しくありません。

「ストリーム」を使用することの重大な欠点の 1 つは、それを関数に渡してから、関数がそこから読み取り、事実上その状態を変更することです。プログラムによっては、必要に応じてその状態を回復するのが面倒になる場合があります。(たとえば、コードを散らかしf.tell()、次にf.seek().)

于 2012-09-25T05:38:38.540 に答える