वास्तविक प्रश्न संपूर्णता में से एक है। क्या आपकी फाइल प्रोसेसिंग फाइल की पूरी प्रोसेसिंग का काम करती है, या यह प्रोसेसिंग स्टेप्स की श्रृंखला में सिर्फ एक टुकड़ा है? यदि यह अपने आप में पूर्ण है, तो किसी फ़ंक्शन के भीतर सभी फ़ाइल एक्सेस को एनकैप्सुलेट करने के लिए स्वतंत्र महसूस करें।
def ver(filepath):
with open(filepath, "r") as f:
# do processing steps on f
return result
यह withकथन के अंत में संसाधन (फ़ाइल को बंद करना) को अंतिम रूप देने की बहुत अच्छी संपत्ति है ।
यदि फिर भी पहले से खुली हुई फ़ाइल को संसाधित करने की आवश्यकता है, तो आपका भेद ver_1और ver_2अधिक समझ में आता है। उदाहरण के लिए:
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)
इस तरह के स्पष्ट प्रकार के परीक्षण अक्सर , विशेष रूप से जावा, जूलिया, और गो जैसी भाषाओं में किए जाते हैं, जहां टाइप- या इंटरफ़ेस-आधारित प्रेषण सीधे समर्थित है। हालांकि, पायथन में, टाइप-आधारित प्रेषण के लिए कोई भाषा समर्थन नहीं है। आप कभी-कभी पाइथन में प्रत्यक्ष प्रकार-परीक्षण की आलोचना देख सकते हैं, लेकिन व्यवहार में यह अत्यंत सामान्य और काफी प्रभावी दोनों है। यह एक फ़ंक्शन को सामान्यता का एक उच्च स्तर रखने में सक्षम बनाता है, जो कुछ डेटाटाइप्स को इसके रास्ते में आने की संभावना है, संभालती है, उर्फ "टाइपिंग"। प्रमुख अंडरस्कोर पर ध्यान दें _ver_file; यह एक "निजी" फ़ंक्शन (या विधि) को नामित करने का एक पारंपरिक तरीका है। जबकि इसे तकनीकी रूप से सीधे कहा जा सकता है, यह सुझाव देता है कि प्रत्यक्ष बाहरी खपत के लिए फ़ंक्शन का इरादा नहीं है।
2019 अद्यतन: यह देखते हुए अजगर 3 में हाल ही में अद्यतन, उदाहरण के लिए पथ अब संभावित जमा हो जाती है कि के रूप में pathlib.Pathन केवल वस्तुओं strया bytes(3.4+), और उस प्रकार हिंट (, लगभग 3.6+ हालांकि अभी भी सक्रिय रूप से विकसित हो रहा है) मुख्य धारा में गूढ़ से चला गया है, यहाँ है अद्यतन कोड जो इन अग्रिमों को ध्यान में रखते हैं:
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इस संबंध में एक वैकल्पिक "स्ट्रीम_नाम" तर्क का उपयोग किया जा सकता है।