Die eigentliche Frage ist die Vollständigkeit. Handelt es sich bei Ihrer Dateiverarbeitungsfunktion um die vollständige Verarbeitung der Datei, oder handelt es sich nur um ein Teil einer Reihe von Verarbeitungsschritten? Wenn es vollständig ist, können Sie den gesamten Dateizugriff in einer Funktion einschließen.
def ver(filepath):
with open(filepath, "r") as f:
# do processing steps on f
return result
Dies hat die sehr schöne Eigenschaft, die Ressource am Ende der with
Anweisung zu finalisieren (die Datei zu schließen) .
Wenn es jedoch möglicherweise erforderlich ist, eine bereits geöffnete Datei zu verarbeiten, ist die Unterscheidung von ver_1
und ver_2
sinnvoller. Zum Beispiel:
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)
Diese Art der expliziten Typprüfung wird häufig verpönt , insbesondere in Sprachen wie Java, Julia und Go, in denen typ- oder schnittstellenbasiertes Dispatching direkt unterstützt wird. In Python gibt es jedoch keine Sprachunterstützung für typbasiertes Dispatching. Es kann gelegentlich vorkommen, dass Sie in Python Kritik an direkten Typprüfungen üben, in der Praxis ist dies jedoch äußerst verbreitet und recht effektiv. Es ermöglicht einer Funktion ein hohes Maß an Allgemeingültigkeit, wobei alle Datentypen behandelt werden, die wahrscheinlich ihren Weg finden, auch bekannt als "Duck Typing". Beachten Sie den führenden Unterstrich an _ver_file
; Dies ist eine herkömmliche Art, eine "private" Funktion (oder Methode) zu bezeichnen. Sie kann zwar technisch direkt aufgerufen werden, weist jedoch darauf hin, dass die Funktion nicht für den direkten externen Verbrauch vorgesehen ist.
Update 2019: Angesichts der jüngsten Aktualisierungen in Python 3, zum Beispiel, dass Pfade jetzt möglicherweise pathlib.Path
nicht nur als Objekte str
oder bytes
(3.4+) gespeichert werden und dieser Hinweis vom Esoterischen zum Mainstream übergegangen ist (ca. 3.6+, obwohl er sich immer noch aktiv weiterentwickelt), hier aktualisierter Code, der diese Fortschritte berücksichtigt:
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
In diesem Zusammenhang kann ein optionales Argument "stream_name" verwendet werden.