मॉड्यूल्स और इम्पोर्ट
अपनी लिखी फ़ाइल को दूसरी फ़ाइल से इस्तेमाल करना, import करने पर वास्तव में क्या होता है, `if __name__ == "__main__"` क्यों ज़रूरी है, स्टैंडर्ड लाइब्रेरी, और नाम के टकराव का जाल।
- 1समस्या
- 2समझें
- 3उदाहरण
- 4अनुमान
- 5स्वयं करें
- 6चुनौती
वह समस्या जिसे हम हल कर रहे हैं
पिछले अध्याय में हमने एक line_total फ़ंक्शन लिखा था। अब एक दूसरे प्रोग्राम को उसी चीज़ की आवश्यकता है।
आसान तरीका इसे कॉपी करना है। यह पहले दिन काम करता है।
फिर टैक्स की दर बदल जाती है। आप एक फ़ाइल ठीक करते हैं और दूसरी भूल जाते हैं। अब दो प्रोग्राम एक ही ऑर्डर के लिए दो अलग-अलग योग दिखाते हैं, और यह कहना असंभव है कि कौन सा सही है — क्योंकि दोनों अपनी-अपनी फ़ाइल के अनुसार सही हैं।
समस्या कॉपी करने के प्रयास की नहीं है। समस्या यह है कि सत्य अब दो स्थानों पर रहता है।
import pricing
print(pricing.TAX_RATE)
print(pricing.line_total(15.0, 3))0.15
51.75एक फ़ाइल, और जितने चाहें उतने प्रोग्राम उसका उपयोग कर सकते हैं। जब दर बदलती है, तो यह एक ही स्थान पर बदलती है।
यह अध्याय उसी एक पंक्ति — import — और इसके पीछे वास्तव में क्या होता है, इसके बारे में है।
इस मिशन के अंत तक आप सीखेंगे
- अपनी लिखी फ़ाइल को दूसरी फ़ाइल से इम्पोर्ट करना
import x,from x import yऔरimport x as zके बीच अंतर बताना- यह जानना कि इम्पोर्ट के समय वास्तव में क्या होता है, और यह कितनी बार होता है
- यह समझाना कि
if __name__ == "__main__":क्यों लिखा जाता है - स्टैंडर्ड लाइब्रेरी से मॉड्यूल्स लाना
- यह जानना कि पायथन कहाँ खोजता है, और अपने नाम की फ़ाइल से किसी मॉड्यूल को छिपाने से बचना
पूर्वापेक्षाएँ: स्कोप और म्युटेबल डिफ़ॉल्ट्स.
एक मॉड्यूल केवल एक फ़ाइल है
pricing.py नामक फ़ाइल एक मॉड्यूल है जिसे pricing कहा जाता है। कुछ भी घोषित करने की आवश्यकता नहीं है — फ़ाइल का होना ही पर्याप्त है।
import pricing पूरे मॉड्यूल को अंदर लाता है, और इसके अंदर की चीज़ों तक डॉट के माध्यम से पहुँचा जाता है: pricing.TAX_RATE, pricing.line_total(...)।
डॉट अतिरिक्त टाइपिंग जैसा लग सकता है, लेकिन यह एक काम करता है — पढ़ते समय यह बताता है कि चीज़ कहाँ से आई है।
केवल वही लाना जिसकी आपको आवश्यकता है
from pricing import line_total
print(line_total(15.0, 3))
print(TAX_RATE)51.75
NameError: name 'TAX_RATE' is not definedfrom ... import ... केवल वही नाम लाता है जो माँगा गया था, और उस नाम का सीधे उपयोग किया जाता है।
लेकिन अन्य नाम नहीं आते। TAX_RATE नहीं माँगा गया था, इसलिए यह यहाँ उपलब्ध नहीं है।
किसे इस्तेमाल करें? संक्षेप में: जब आपको दो या तीन नामों की आवश्यकता हो तो from, जब आपको कई नामों की आवश्यकता हो तो पूरा मॉड्यूल। और एक चीज़ कभी न करें — from pricing import *। यह चुपचाप हर नाम को खींच लेता है।
इम्पोर्ट करते समय नाम बदलना — as
import pricing as p
print(p.line_total(15.0, 3))51.75as मॉड्यूल को इस फ़ाइल के अंदर एक छोटा नाम देता है।
इम्पोर्ट करने का मतलब है फ़ाइल चलाना
tools.py:
print("tools is being set up")
def ping():
return "pong"main.py:
print("main starts")
import tools
import tools
print(tools.ping())
print("main ends")main starts
tools is being set up
pong
main endsदो बातें ध्यान देने योग्य हैं:
इम्पोर्ट करने का मतलब है फ़ाइल को ऊपर से नीचे तक चलाना। def पंक्तियाँ फ़ंक्शन बनाती हैं, और बाकी सब कुछ वास्तव में निष्पादित होता है। मॉड्यूल के शीर्ष स्तर पर print या input रखने से यह उसे इम्पोर्ट करने वाले प्रत्येक व्यक्ति पर चलता है।
दूसरे import tools ने कुछ नहीं किया। एक मॉड्यूल प्रति प्रोग्राम केवल एक बार चलता है; उसके बाद पायथन वही लौटा देता है जो उसके पास पहले से है।
__name__ और वह प्रसिद्ध पंक्ति
प्रत्येक मॉड्यूल के अंदर __name__ नामक एक चर होता है, जिसे पायथन स्वयं सेट करता है।
tools.py:
def ping():
return "pong"
print("module name is", __name__)
if __name__ == "__main__":
print("running directly")नियम सरल है: जिस फ़ाइल को आप सीधे चला रहे हैं उसका __name__ "__main__" होता है; जिन फ़ाइलों को इम्पोर्ट किया जा रहा है उनका नाम उनका अपना मॉड्यूल नाम होता है।
इसलिए if __name__ == "__main__": के अंदर जो कुछ भी है वह केवल तब चलता है जब फ़ाइल सीधे चलाई जाती है, कभी तब नहीं जब इसे इम्पोर्ट किया जाता है।
स्टैंडर्ड लाइब्रेरी (Standard Library)
पायथन के साथ कई मॉड्यूल्स पहले से आते हैं:
import math
import statistics
print(math.sqrt(144))
print(math.floor(3.7), math.ceil(3.2))
print(statistics.mean([10, 20, 60]))12.0
3 4
30एक और जो अक्सर उपयोग होता है:
import random
random.seed(7)
print(random.randint(1, 100))
print(random.choice(["pen", "bag", "ink"]))42
penrandom.seed(7) के बिना प्रत्येक रन अलग-अलग संख्याएँ देगा। एक सीड (seed) सेट करना क्रम को स्थिर कर देता है, ताकि परिणाम दोहराए जा सकें।
पायथन कहाँ खोजता है
import pricing के लिए, पायथन क्रम में खोजता है: पहले इंटरप्रेटर में निर्मित मॉड्यूल्स, फिर स्क्रिप्ट का फ़ोल्डर, फिर स्टैंडर्ड लाइब्रेरी, फिर इंस्टॉल किए गए पैकेज।
नियम: कभी भी किसी फ़ाइल का नाम किसी मॉड्यूल के नाम पर न रखें। random.py, string.py, json.py, csv.py — यदि आप अपने फ़ोल्डर में random.py बनाते हैं, तो import random आपकी फ़ाइल को लोड करेगा न कि पायथन के असली मॉड्यूल को!
एक संपूर्ण उदाहरण
तीन फाइलें:
pricing.py:
"""कीमतें और टैक्स। यहाँ कुछ भी प्रिंट नहीं होता है, और न ही इनपुट माँगा जाता है।"""
TAX_RATE = 0.15
def line_total(price, quantity):
"""ऑर्डर की एक पंक्ति, टैक्स सहित।"""
return round(price * quantity * (1 + TAX_RATE), 2)
def order_total(lines):
"""`lines` (name, price, quantity) टपल्स की एक सूची है।"""
return round(sum(line_total(price, qty) for _, price, qty in lines), 2)report.py:
"""संख्याओं को टेक्स्ट की पंक्तियों में बदलना।"""
import pricing
def receipt(lines):
rows = [f"{name:<8} {pricing.line_total(price, qty):>8.2f}"
for name, price, qty in lines]
rows.append("-" * 17)
rows.append(f"{'total':<8} {pricing.order_total(lines):>8.2f}")
return rows
if __name__ == "__main__":
print("report.py has no data of its own to show")main.py:
"""एकमात्र फ़ाइल जिसे सीधे चलाने के लिए बनाया गया है।"""
import statistics
from report import receipt
ORDER = [
("pen", 15.0, 3),
("bag", 850.0, 1),
("ink", 120.0, 2),
]
def main():
for row in receipt(ORDER):
print(row)
print()
quantities = [qty for _, _, qty in ORDER]
print("mean quantity:", statistics.mean(quantities))
if __name__ == "__main__":
main()python main.py चलाने पर:
pen 51.75
bag 977.50
ink 276.00
-----------------
total 1305.25
mean quantity: 2जब यह टूटता है
ModuleNotFoundError: No module named 'priceing' गलत वर्तनी, या फ़ाइल दूसरे फ़ोल्डर में है।
ImportError: cannot import name 'line_totl' from 'pricing' मॉड्यूल मिल गया, लेकिन उसके अंदर का नाम नहीं मिला।
AttributeError: module 'random' has no attribute 'choice' लगभग हमेशा आपकी बनाई कोई फ़ाइल असली मॉड्यूल को छिपा रही होती है। अपने फ़ोल्डर में उस नाम की फ़ाइल ढूंढें और उसका नाम बदलें।
ImportError: circular import दो फ़ाइलें एक-दूसरे को इम्पोर्ट कर रही हैं। दोनों को जो चाहिए उसे एक तीसरी फ़ाइल में ले जाएं।
चरण 4 / 6 — अनुमान
अपनी समझ की जाँच करें
line_total was asked for, TAX_RATE was not. What happens?
# pricing.py
TAX_RATE = 0.15
def line_total(price, quantity):
return round(price * quantity * (1 + TAX_RATE), 2)
# main.py
from pricing import line_total
print(line_total(15.0, 3))
print(TAX_RATE)- A`51.75` prints, then a `NameError`
- BBoth `51.75` and `0.15` print
- CAn `ImportError`
- D`51.75` prints, then `None`
import tools is written twice. What is printed?
# tools.py
print("tools is being set up")
def ping():
return "pong"
# main.py
print("main starts")
import tools
import tools
print(tools.ping())
print("main ends")- Amain starts tools is being set up pong main ends
- Bmain starts tools is being set up tools is being set up pong main ends
- Ctools is being set up main starts pong main ends
- Dmain starts pong main ends
python main.py is being run. What is printed?
# tools.py
print("name:", __name__)
if __name__ == "__main__":
print("direct")
# main.py
import tools
print("done")- Aname: tools done
- Bname: __main__ direct done
- Cname: tools direct done
- Dname: main done
उत्तर देने के लिए अकाउंट आवश्यक है
अपने उत्तर जाँचने के लिए साइन इन करें
प्रश्न ऊपर दिए गए हैं, और मन में उत्तर सोचना ही मुख्य कार्य है। सही उत्तर, व्याख्या और तीन-स्तरीय संकेत देखने के लिए साइन इन करें।
आपकी बारी
एक फ़ोल्डर में तीन फ़ाइलें बनाएं:
textutil.py — दो फ़ंक्शंस: initials(name) और shorten(text, limit)। इस फ़ाइल में कहीं भी print नहीं होना चाहिए।
table.py — textutil को इम्पोर्ट करता है, और rows(people) प्रदान करता है।
main.py — table को इम्पोर्ट करता है, इसे कुछ नामों के साथ कॉल करता है, और प्रिंट करता है। तीनों फ़ाइलों में if __name__ == "__main__": रखें।
Step 6 of 6
चुनौती — the chapter quiz
सरल से कठिन — दस प्रश्न, अंतिम वाले जानबूझकर चुनौतीपूर्ण बनाए गए हैं।
Sign in to take the quiz