मॉड्यूल (और पैकेज) आपके प्रोग्राम को अलग-अलग नामस्थानों में विभाजित करने का एक शानदार पायथोनिक तरीका है, जो इस प्रश्न का एक निहित लक्ष्य प्रतीत होता है। वास्तव में, जैसा कि मैं पायथन की मूल बातें सीख रहा था, मैंने ब्लॉक स्कोप फीचर की कमी से निराश महसूस किया। हालांकि एक बार जब मैंने पायथन मॉड्यूल को समझ लिया, तो मैं ब्लॉक स्कोप की आवश्यकता के बिना अपने पिछले लक्ष्यों को अधिक सुरुचिपूर्ण ढंग से महसूस कर सकता था।
प्रेरणा के रूप में, और लोगों को सही दिशा की ओर इंगित करने के लिए, मुझे लगता है कि यह पायथन के कुछ डांट-फटकार के स्पष्ट उदाहरण प्रदान करने के लिए उपयोगी है। पहले मैंने ब्लॉक दायरे को लागू करने के लिए पायथन कक्षाओं का उपयोग करने में अपने असफल प्रयास की व्याख्या की। आगे मैं समझाता हूं कि मैंने पायथन मॉड्यूल का उपयोग करके कुछ और उपयोगी कैसे प्राप्त किया। अंत में मैं डेटा को लोड करने और फ़िल्टर करने के लिए पैकेजों के एक व्यावहारिक अनुप्रयोग को रेखांकित करता हूं।
कक्षाओं के साथ ब्लॉक गुंजाइश का प्रयास
कुछ क्षणों के लिए मुझे लगा कि मैंने कक्षा घोषणा के अंदर कोड चिपका कर ब्लॉक गुंजाइश हासिल कर ली है:
x = 5
class BlockScopeAttempt:
x = 10
print(x)
print(x)
जब कोई फ़ंक्शन परिभाषित होता है, तो दुर्भाग्य से यह टूट जाता है:
x = 5
class BlockScopeAttempt:
x = 10
print(x)
def printx2():
print(x)
printx2()
ऐसा इसलिए है क्योंकि एक वर्ग के भीतर परिभाषित कार्य वैश्विक दायरे का उपयोग करते हैं। इसे ठीक करने का सबसे आसान (यद्यपि एकमात्र नहीं) तरीका स्पष्ट रूप से वर्ग को निर्दिष्ट करना है:
x = 5
class BlockScopeAttempt:
x = 10
print(x)
def printx2():
print(BlockScopeAttempt.x)
printx2()
यह इतना सुरुचिपूर्ण नहीं है क्योंकि किसी वर्ग में निहित होने या न होने के आधार पर किसी को अलग से फ़ंक्शन लिखना होगा।
पायथन मॉड्यूल के साथ बेहतर परिणाम
मॉड्यूल स्थिर कक्षाओं के समान हैं, लेकिन मेरे अनुभव में मॉड्यूल बहुत साफ हैं। मॉड्यूल के साथ भी ऐसा करने के लिए, मैं my_module.py
निम्नलिखित सामग्रियों के साथ वर्तमान कार्य निर्देशिका में एक फ़ाइल बनाता हूं :
x = 10
print(x)
def printx():
global x
print(x)
फिर मेरी मुख्य फ़ाइल या इंटरेक्टिव (जैसे ज्यूपिटर) सत्र में, मैं करता हूं
x = 5
import my_module
my_module.printx()
print(x)
स्पष्टीकरण के रूप में, प्रत्येक पायथन फ़ाइल एक मॉड्यूल को परिभाषित करता है जिसका अपना वैश्विक नाम स्थान है। एक मॉड्यूल आयात करने से आप इस नाम स्थान के चर को .
सिंटैक्स के साथ एक्सेस कर सकते हैं ।
यदि आप एक इंटरैक्टिव सत्र में मॉड्यूल के साथ काम कर रहे हैं, तो आप शुरुआत में इन दो पंक्तियों को निष्पादित कर सकते हैं
%load_ext autoreload
%autoreload 2
और जब उनकी संबंधित फाइलें संशोधित हो जाएंगी और मॉड्यूल अपने आप लोड हो जाएंगे।
डेटा लोड करने और फ़िल्टर करने के लिए पैकेज
पैकेज का विचार मॉड्यूल अवधारणा का एक मामूली विस्तार है। एक पैकेज एक निर्देशिका (संभवतः रिक्त) __init__.py
फ़ाइल है, जिसे आयात पर निष्पादित किया जाता है। इस निर्देशिका के भीतर मॉड्यूल / पैकेज को .
सिंटैक्स के साथ एक्सेस किया जा सकता है ।
डेटा विश्लेषण के लिए, मुझे अक्सर एक बड़ी डेटा फ़ाइल पढ़ने की आवश्यकता होती है और फिर विभिन्न फिल्टर को अंतःक्रियात्मक रूप से लागू करना होता है। किसी फ़ाइल को पढ़ने में कई मिनट लगते हैं, इसलिए मैं केवल एक बार करना चाहता हूं। ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के बारे में मैंने स्कूल में जो सीखा, उसके आधार पर, मैं मानता था कि किसी वर्ग में तरीकों के रूप में फ़िल्टर करने और लोड करने के लिए कोड लिखना चाहिए। इस दृष्टिकोण का एक बड़ा नुकसान यह है कि अगर मैं अपने फिल्टर को फिर से परिभाषित करता हूं, तो मेरी कक्षा की परिभाषा बदल जाती है, इसलिए मुझे डेटा सहित पूरी कक्षा को फिर से लोड करना होगा।
आजकल पायथन के साथ, मैं एक पैकेज को परिभाषित करता हूं, my_data
जिसमें सबमोड्यूल्स होता है जिसका नाम load
और है filter
। अंदर filter.py
मैं एक रिश्तेदार आयात कर सकते हैं:
from .load import raw_data
यदि मैं संशोधित करता हूं filter.py
, तो autoreload
परिवर्तनों का पता लगाएगा। यह पुनः लोड नहीं करता है load.py
, इसलिए मुझे अपना डेटा पुनः लोड करने की आवश्यकता नहीं है। इस तरह मैं एक ज्यूपिटर नोटबुक में अपने फ़िल्टरिंग कोड को प्रोटोटाइप कर सकता हूं, इसे फ़ंक्शन के रूप में लपेट सकता हूं, और फिर सीधे मेरी नोटबुक से कट-पेस्ट कर सकता हूं filter.py
। यह पता लगाने ने मेरे वर्कफ़्लो में क्रांति ला दी, और मुझे एक संदेहवादी से "ज़ेन के पायथन" में एक आस्तिक में बदल दिया।
One purpose (of many) is to improve code readability
- पायथन कोड, सही तरीके से लिखा गया है (यानी, अजगर के ज़ेन का अनुसरण करते हुए ) पठनीय होने के लिए इस तरह के गार्निश की आवश्यकता नहीं होगी। वास्तव में, यह पायथन के बारे में मुझे पसंद है (कई) चीजों में से एक है।