Asıl soru, bir bütünlüktür. Dosya işleme fonksiyonunuz dosyanın tam olarak işlenmesi mi yoksa işlem adımlarının zincirinde sadece bir parça mı? Tamamen kendi başına tamamlanmışsa, bir işlev içindeki tüm dosya erişimini almaktan çekinmeyin.
def ver(filepath):
with open(filepath, "r") as f:
# do processing steps on f
return result
Bu, withifadenin sonunda kaynağı sonlandırma (dosyayı kapatma) konusunda çok hoş bir özelliğe sahiptir .
Bununla birlikte, halihazırda açık olan bir dosyayı işlemeye ihtiyaç duyulması muhtemelse, o zaman sizden ayrılın ver_1ve ver_2daha anlamlı olun. Örneğin:
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)
Bu tür açık tür testler , özellikle tür veya arabirim tabanlı gönderimin doğrudan desteklendiği yerlerde, özellikle Java, Julia ve Go gibi dillerde kaşlarını çattı . Ancak Python'da tür tabanlı gönderme için dil desteği yoktur. Python'da bazen doğrudan tip testi eleştirisini görebilirsiniz, ancak pratikte hem oldukça yaygın hem de oldukça etkili. Bir fonksiyonun yüksek derecede bir genelliğe sahip olmasını sağlar, veri tiplerinin yoluna girme olasılığı ne olursa olsun, yani "ördek yazma". Önde gelen alt çizgiyi not edin _ver_file; bu, "özel" bir işlev (veya yöntem) belirlemenin geleneksel bir yoludur. Teknik olarak doğrudan çağrılabilse de, işlevin doğrudan dış tüketim için tasarlanmadığını düşündürmektedir.
2019 güncellemesi: Python 3'teki son güncellemeler göz önüne alındığında, örneğin, yolların şimdi potansiyel olarak pathlib.Pathsadece strveya bytes(3.4+) değil de nesne olarak depolandığı ve bu tür ipuçlarının ezoterikten ana akıma (yaklaşık 3.6+, ancak hala aktif olarak gelişmekte olan) gittiği belirtildi. Bu gelişmeleri hesaba katan güncellenmiş kod:
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_functionBu konuda kullanılabilecek isteğe bağlı bir "stream_name" argümanı .