本当の問題は完全性です。ファイル処理機能はファイルの完全な処理ですか、それとも一連の処理ステップの一部ですか?それ自体で完全な場合は、関数内のすべてのファイルアクセスを自由にカプセル化してください。
def ver(filepath):
with open(filepath, "r") as f:
# do processing steps on f
return result
これには、with
ステートメントの最後でリソースをファイナライズする(ファイルを閉じる)という非常に優れたプロパティがあります。
ただし、既に開いているファイルを処理する必要がある可能性がある場合は、あなたver_1
との区別ver_2
がより意味があります。例えば:
def _ver_file(f):
# do processing steps on f
return result
def ver(fileobj):
if isinstance(fileobj, str):
with open(fileobj, 'r') as f:
return _ver_file(f)
else:
return _ver_file(fileobj)
この種の明示的な型テストは、特にJava、Julia、Goなどの型またはインターフェイスベースのディスパッチが直接サポートされている言語では、しばしば嫌われます。ただし、Pythonでは、型ベースのディスパッチの言語サポートはありません。Pythonで直接型テストを批判することもありますが、実際には非常に一般的で非常に効果的です。これにより、関数に高度な汎用性を持たせ、「ダックタイピング」とも呼ばれるデータ型が処理されるようになります。の先頭のアンダースコアに注意してください_ver_file
。これは、「プライベート」関数(またはメソッド)を指定する従来の方法です。技術的には直接呼び出すことができますが、関数は直接的な外部消費を目的としていないことを示唆しています。
2019アップデート:パスは今、潜在的として格納されていることを、たとえば、Pythonの3に最新の更新を考えるpathlib.Path
だけではなく、オブジェクトstr
またはbytes
(3.4+)、及び(まだ積極的に進化しても、年頃3.6以降)、そのタイプヒンティングは難解から主流になった、ここでのこれらの進歩を考慮した更新コード:
from pathlib import Path
from typing import IO, Any, AnyStr, Union
Pathish = Union[AnyStr, Path] # in lieu of yet-unimplemented PEP 519
FileSpec = Union[IO, Pathish]
def _ver_file(f: IO) -> Any:
"Process file f"
...
return result
def ver(fileobj: FileSpec) -> Any:
"Process file (or file path) f"
if isinstance(fileobj, (str, bytes, Path)):
with open(fileobj, 'r') as f:
return _ver_file(f)
else:
return _ver_file(fileobj)
your_function
これに関して、オプションの「stream_name」引数を使用できます。