실제 질문은 완전성 중 하나입니다. 파일 처리 기능이 파일의 전체 처리입니까, 아니면 일련의 처리 단계 중 하나입니까? 그것이 완전하고 완전하다면, 함수 내에서 모든 파일 액세스를 자유롭게 캡슐화하십시오.
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에서는 유형 기반 디스패치에 대한 언어 지원이 없습니다. 때로는 파이썬에서 직접 유형 테스트에 대한 비판을 볼 수 있지만 실제로는 매우 일반적이며 효과적입니다. 그것은 "Duck 타이핑"이라고하는 데이터 타입을 처리 할 수있는 기능을 제공합니다. 밑줄에 주목하십시오 _ver_file
. 이는 "비공개"기능 (또는 방법)을 지정하는 일반적인 방법입니다. 기술적으로 직접 호출 할 수는 있지만 함수가 직접적인 외부 소비를위한 것이 아니라고 제안합니다.
2019 업데이트 : Python 3의 최신 업데이트를 고려할 때 경로가 잠재적으로 또는 (3.4+)가 pathlib.Path
아닌 객체로 저장 될 수 있으며 유형 힌트가 밀교에서 주류로 (현재 활발하게 진화하고는 있지만 3.6 이상) 변경되었습니다. 이러한 발전을 고려한 업데이트 된 코드 :str
bytes
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"인수를 사용할 수 있습니다.