2025, Oct 21 10:31
क्या Python एक ही लाइन में मॉड्यूल और प्रतीक import कर सकता है?
जानें क्यों Python एक ही लाइन में मॉड्यूल और उसके प्रतीक को import नहीं कर सकता, और dataclasses व json के साथ साफ, मानकीकृत इम्पोर्ट पैटर्न कैसे अपनाएँ.
Python में अलग-अलग import शैलियाँ मिलाते समय अक्सर यह लालच होता है कि एक ही लाइब्रेरी के लिए import module और from module import name दोनों रखे जाएँ। वजह आमतौर पर स्पष्टता होती है: अस्पष्टता से बचने के लिए json.dumps और dataclasses.asdict को मॉड्यूल प्रीफिक्स के साथ बुलाएँ, जबकि डेकोरेटर @dataclass को छोटा और पढ़ने में सहज रखा जाए। सवाल यह है कि क्या Python एक ही पंक्ति में मॉड्यूल और उसी मॉड्यूल से किसी खास प्रतीक को साथ में लाने की अनुमति देता है।
दुविधा को दिखाने वाला उदाहरण
import dataclasses
from dataclasses import dataclass
import json
@dataclass
class Vector3:
    i: int
    j: int
    k: int
    def as_json(self) -> str:
        return json.dumps(dataclasses.asdict(self))
यहाँ json.dumps और dataclasses.asdict को स्पष्ट रखने के लिए मॉड्यूल-प्रिफिक्स के साथ बुलाया गया है, जबकि @dataclass सीधे इस्तेमाल किया गया है क्योंकि यह पढ़ने में सहज है और साफ़ तौर पर dataclasses मॉड्यूल से जुड़ा है।
भाषा वास्तव में क्या अनुमति देती है
सीधा और ठोस जवाब यह है: Python में ऐसा कोई एकल स्टेटमेंट नहीं है जो एक साथ मॉड्यूल और उसी मॉड्यूल से कोई प्रतीक इम्पोर्ट करे। आप इन दो स्टेटमेंट्स को किसी काल्पनिक from dataclasses import self, dataclass से नहीं बदल सकते। import स्टेटमेंट के सिंटैक्स के हिसाब से आपके पास जो रूप है, वही सही है।
नहीं, ‘The import statement - Python Language Reference’ के अनुसार। जो आपके पास है, वही सही है।
अगर आप सच में एक ही इम्पोर्ट स्थान चाहते हैं तो व्यावहारिक उपाय
यदि आप हर उपभोक्ता मॉड्यूल में एक ही इम्पोर्ट लाइन रखना चाहते हैं, तो एक उपाय यह है कि इम्पोर्ट्स को एक समर्पित मॉड्यूल में केंद्रीकृत करें और बाकी जगहों पर वहीं से इम्पोर्ट लें। इससे Python का सिंटैक्स नहीं बदलता; बस दोहराव एक ही जगह समेट दिया जाता है।
पहले, एक मॉड्यूल बनाइए जो इम्पोर्ट्स को समेटे:
# `hub_imports.py` की सामग्री
import dataclasses
from dataclasses import dataclass
import json
फिर, अपने कोड में इन्हें इस तरह उपयोग करें:
from hub_imports import dataclasses, dataclass, json
@dataclass
class Node3D:
    a: int
    b: int
    c: int
    def to_json_text(self) -> str:
        return json.dumps(dataclasses.asdict(self))
print(Node3D(a=1, b=2, c=3).to_json_text())
यह पैटर्न उन मॉड्यूल्स में एक ही इम्पोर्ट स्टेटमेंट देता है जो इन नामों का उपयोग करते हैं, और जहाँ ज़रूरत हो वहाँ स्पष्ट मॉड्यूल-प्रिफिक्स भी बनाए रखता है।
यह क्यों मायने रखता है
dataclass जैसे नाम हमेशा सिर्फ एक लाइब्रेरी तक सीमित नहीं होते; उदाहरण के लिए, Pydantic में भी एक वैकल्पिक इम्प्लीमेंटेशन है। कौन-सी वस्तुएँ सीधे इम्पोर्ट की जाएँ और किन्हें मॉड्यूल प्रीफिक्स के साथ इस्तेमाल किया जाए, इस पर सजग निर्णय लेना कोड का ऑडिट और समझ आसान बनाता है। स्वीकृत इम्पोर्ट्स को एक जगह केंद्रित करना यह भी सुनिश्चित करता है कि पूरे कोडबेस में क्या अनुमति है, उस पर आपका नियंत्रण स्पष्ट रहे।
एक और बारीकी ध्यान देने योग्य है: dataclasses में फ़ंक्शन का नाम asdict() है, as_dict() नहीं। सही API नाम का प्रयोग अनावश्यक रनटाइम त्रुटियों से बचाता है।
यह केंद्रीकरण तरीका वैचारिक रूप से उन “barrel files” जैसा है जिनका उल्लेख कुछ JavaScript कोडबेस में होता है। यह उपयोगी हो सकता है, लेकिन यह एक डिज़ाइन-पसंद भी है जो सभी को पसंद नहीं आती। इसे संभावित टूल की तरह देखें, कोई अनिवार्य नियम नहीं।
मुख्य बातें
Python एक ही पंक्ति में मॉड्यूल और उससे कोई खास प्रतीक दोनों को इम्पोर्ट करने का तरीका नहीं देता। प्रचलित और सही तरीका है दो अलग-अलग इम्पोर्ट स्टेटमेंट्स का उपयोग। यदि आप प्रोजेक्ट भर में इम्पोर्ट्स को मानकीकृत करना चाहते हैं या अलग-अलग मॉड्यूल्स में दोहराव कम करना चाहते हैं, तो उन्हें एक समर्पित मॉड्यूल में समूहित कर वहाँ से इम्पोर्ट करें। संभावित रूप से अस्पष्ट कॉल्स के लिए स्पष्ट मॉड्यूल-प्रिफिक्स बनाए रखें, डेकोरेटर्स और बार-बार इस्तेमाल होने वाले नामों में स्पष्टता को प्राथमिकता दें, और सुनिश्चित करें कि आप सही APIs (जैसे dataclasses.asdict()) को ही कॉल कर रहे हैं।
यह लेख StackOverflow पर एक प्रश्न (लेखक: Dominik Kaszewski) और simon के उत्तर पर आधारित है।