La vraie question est celle de la complétude. Votre fonction de traitement de fichier est-elle le traitement complet du fichier ou s'agit-il simplement d'une partie d'une chaîne d'étapes de traitement? S'il est complet et autonome, n'hésitez pas à encapsuler tous les accès aux fichiers au sein d'une fonction.
def ver(filepath):
with open(filepath, "r") as f:
# do processing steps on f
return result
Cela a la très belle propriété de finaliser la ressource (fermeture du fichier) à la fin de la with
déclaration.
Si toutefois il est éventuellement nécessaire de traiter un fichier déjà ouvert, la distinction entre vous ver_1
et a ver_2
plus de sens. Par exemple:
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)
Ce type de test de type explicite est souvent mal vu , en particulier dans des langages tels que Java, Julia et Go, où la distribution par type ou par interface est directement prise en charge. En Python, toutefois, il n'y a pas de prise en charge linguistique pour la répartition basée sur un type. Vous pouvez parfois rencontrer des critiques sur les tests de type directs en Python, mais dans la pratique, elles sont extrêmement courantes et très efficaces. Il permet à une fonction d’avoir un degré de généralité élevé et de manipuler tous les types de données susceptibles de lui arriver, c'est-à-dire "frappe de canard". Notez le trait de soulignement principal sur _ver_file
; c’est une manière conventionnelle de désigner une fonction (ou une méthode) "privée". Bien qu’elle puisse techniquement être appelée directement, elle suggère que la fonction n’est pas destinée à une consommation externe directe.
2019 Mise à jour: Compte tenu des mises à jour récentes en Python 3, par exemple , que les chemins sont maintenant potentiellement stockées sous forme d' pathlib.Path
objets non seulement str
ou bytes
(3.4+), et que le type hinting est passé de ésotérique à intégrer (vers 3.6+, mais toujours en évolution active), voici code mis à jour qui prend en compte ces avancées:
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
peut être utilisé à cet égard.