La vera domanda è di completezza. La tua funzione di elaborazione dei file è l'elaborazione completa del file o è solo un pezzo in una catena di fasi di elaborazione? Se è completo e di per sé, sentiti libero di incapsulare tutto l'accesso ai file all'interno di una funzione.
def ver(filepath):
with open(filepath, "r") as f:
# do processing steps on f
return result
Questa ha la proprietà molto bella di finalizzare la risorsa (chiusura del file) alla fine with
dell'istruzione.
Se tuttavia è possibile che sia necessario elaborare un file già aperto, allora la distinzione tra te ver_1
e ver_2
ha più senso. Per esempio:
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)
Questo tipo di test esplicito del tipo è spesso disapprovato , specialmente in linguaggi come Java, Julia e Go in cui il dispacciamento basato sul tipo o sull'interfaccia è direttamente supportato. In Python, tuttavia, non esiste alcun supporto linguistico per il dispacciamento basato sul tipo. Di tanto in tanto potresti vedere critiche alla prova diretta del tipo in Python, ma in pratica è sia estremamente comune che abbastanza efficace. Permette a una funzione di avere un alto grado di generalità, gestendo qualsiasi tipo di dato sia probabile che arrivi, noto anche come "tipizzazione anatra". Nota il carattere di sottolineatura iniziale su _ver_file
; questo è un modo convenzionale di designare una funzione (o metodo) "privata". Sebbene tecnicamente possa essere chiamato direttamente, suggerisce che la funzione non è destinata al consumo esterno diretto.
Aggiornamento 2019: dati i recenti aggiornamenti in Python 3, ad esempio che i percorsi sono ora potenzialmente archiviati come pathlib.Path
oggetti non solo str
o bytes
(3.4+) e che il tipo di suggerimento è passato dall'esoterico al mainstream (circa 3.6+, sebbene continui a evolversi attivamente), ecco codice aggiornato che tiene conto di questi progressi:
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
questo proposito è possibile utilizzare un argomento "stream_name" facoltativo .