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, with
ifadenin 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_1
ve ver_2
daha 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.Path
sadece str
veya 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_function
Bu konuda kullanılabilecek isteğe bağlı bir "stream_name" argümanı .