2009-12-16 16 views
12

मेरे पास दो संबंधित पायथन 'आयात' प्रश्न हैं। वे आसानी से परीक्षण योग्य होते हैं, लेकिन मुझे ऐसे उत्तर चाहिए जो भाषा परिभाषित हैं और कार्यान्वयन-विशिष्ट नहीं हैं, और मुझे शैली/सम्मेलन में भी रूचि है, इसलिए मैं इसके बजाय यहां पूछ रहा हूं।पायथन आयात यांत्रिकी

1)

मॉड्यूल एक आयात मॉड्यूल बी, और मॉड्यूल बी आयात मॉड्यूल सी, मॉड्यूल में एक स्पष्ट आयात के बिना एक संदर्भ मॉड्यूल सी कोड कर सकते हैं? यदि हां, तो क्या मैं यह मानने में सही हूं कि यह बुरा अभ्यास है?

2)

अगर मैं मॉड्यूल A.B.C आयात करते हैं, कि आयात मॉड्यूल एक और a.b रूप में अच्छी तरह करता है? यदि हां, तो क्या यह सम्मेलन द्वारा import A; import A.B; import A.B.C स्पष्ट रूप से बेहतर है?

+0

"भाषा परिभाषित और कार्यान्वयन-विशिष्ट नहीं" क्या आप कह रहे हैं कि पाइथन कार्यान्वयन किसी भी तरह से अलग हैं? आप किस विशिष्ट अंतर के बारे में जानते हैं? AFAIK कोई नहीं हैं। –

+0

शायद कोई अंतर नहीं है, लेकिन कल्पना द्वारा परिभाषित कुछ भी कार्यान्वयन तक नहीं है। पाइथन डॉक्स को सीपीथॉन कार्यान्वयन विवरण के बारे में चेतावनी के साथ भरे हुए हैं जो अन्य कार्यान्वयन में लागू नहीं हो सकते हैं। –

उत्तर

12

सबसे पहले आपको पता होना चाहिए कि पायथन भाषा आईएसओ मानक नहीं है। यह सी/सी ++ से अलग है, और इसका मतलब है कि भाषा व्यवहार को परिभाषित करने के लिए कोई "उचित" तरीका नहीं है - सीपीथन कुछ ऐसा कर सकता है क्योंकि इसे इस तरह से कोड किया गया था, और ज्योथन दूसरे तरीके से हो सकता है।

अपने प्रश्नों के बारे में, याद रखें कि एक मॉड्यूल "आयात" एक दो भाग का ऑपरेशन है: पहला मॉड्यूल लोड होता है - अगर यह कभी नहीं होता, उदा। यदि यह sys.modules में उपलब्ध नहीं था, तो स्थानीय नामस्थान में उस मॉड्यूल के लिए एक नाम बाध्य है।

इसलिए

:

1) हाँ, आप उचित नाम स्थान है, उदा प्रदान करके संदर्भित कर सकते हैं जो कुछ भी आप मॉड्यूल एक से चाहते हैं आप = "कुछ"

तरह

BCname कुछ करना होगा और मुझे लगता है यह बहुत मुश्किल से ही अजगर कार्यक्रमों में किया जाता है और बुरा व्यवहार माना जा सकता है क्योंकि यह बलों एक "सकर्मक डीईपी" - कुछ करता है, तो मॉड्यूल बी कार्यान्वयन को फिर से संसाधित किया जाता है और अब सी पर निर्भर नहीं होता है, इसे केवल एक डीपीएस को संतुष्ट करने के लिए सी मॉड्यूल की पेशकश जारी रखना चाहिए।

बेशक सेटिंग __ सभी __ इसे रोक सकते हैं, और एक अच्छा अभ्यास आपके सभी मॉड्यूल में __ सभी __ डालने के लिए हो सकता है, और केवल निर्यात करें जो आप वास्तव में सार्वजनिक होना चाहते हैं।

2) हां और नहीं। कर

import a.b.c.d 

सभी मॉड्यूल पर पहले आयात चरण (लोड हो रहा है) का इस्तेमाल करता है, लेकिन सिर्फ एक (और, रिकर्सिवली, ग के संबंध में, आदि के साथ ख में), लेकिन श्रृंखला में सभी मॉड्यूल चाहिए पर दूसरा पूर्ण नामस्थान द्वारा संदर्भित किया जाना चाहिए; इस तरह के एक आयात के बाद, आप

a.something 
a.b.something 
a.b.c.something 

कर सकते हैं, लेकिन आप ऐसा नहीं कर सकते

c.something 
b.something 

मैं मानता चाहिए उपयोग के उस तरह के रूप में अच्छी तरह सुंदर दुर्लभ है; मैं आम तौर पर "मॉड्यूल आयात से कुछ" आयात करने के लिए पसंद करता हूं, और आम तौर पर आप केवल जो चाहते हैं उसके लिए पूछते हैं - ऐसे घोंसले पुस्तकालयों में न तो आम हैं, न ही इसका उपयोग आम है।

कई बार "बाहरी पैकेज" होते हैं, जो संगठन के लिए उपयोग किए जाते हैं, जो कक्षाओं के साथ मॉड्यूल रखते हैं। यह बहुत संभावना है कि उपरोक्त ए, बी, सी केवल पैकेज हैं, और डी एक मॉड्यूल है जो वास्तव में कक्षाओं, कार्यों और अन्य वस्तुओं को रखता है।तो उचित उपयोग होगा:

from a.b.c.d import name1, name2, name3 

मुझे आशा है कि यह आपकी जिज्ञासा को पूरा करेगा।

+0

विस्तृत उत्तर के लिए धन्यवाद! –

+0

आईएसओ नहीं होने पर, एक पायथन भाषा संदर्भ है जो आयात सहित "उचित" व्यवहार को परिभाषित करता है: http://docs.python.org/reference/simple_stmts.html#the-import-statement भाषा संदर्भ बिंदु CPython कार्यान्वयन विवरण, लेकिन लक्ष्य का एक सामान्य विनिर्देश होना है, ताकि यह सभी कार्यान्वयन-निर्भर नहीं है। –

11

एलन ने एक अच्छा जवाब दिया, लेकिन मैं इसे आपके प्रश्न 1 के लिए जोड़ना चाहता था यह आपके 'आयात' से क्या मतलब है इस पर निर्भर करता है।

यदि आप from C import x वाक्यविन्यास का उपयोग करते हैं, तो B के नामस्थान में उपलब्ध हो जाता है। यदि A में आप import B करते हैं, तो आप x पर A से B.x तक पहुंच सकते हैं।

यह संभावित रूप से भ्रमित करने के रूप में इतना बुरा व्यवहार नहीं है, और डिबगिंग आदि को कठिन बना देगा क्योंकि आपको यह नहीं पता होगा कि वस्तुएं कहां से आई हैं।

+0

यह एक उपयोगी स्पष्टीकरण है, धन्यवाद। मैं जावा-स्टाइल पैकेज आयात के समान 'आयात' के बारे में सोच रहा था, लेकिन स्पष्ट रूप से समानता केवल सतही है। –

+0

यदि यह भ्रमित है, तो क्या यह बुरा अभ्यास कहने के लिए पर्याप्त कारण नहीं है? यह स्पष्ट होना चाहिए कि कोड आईएमएचओ पढ़ने से क्या करता है। – jjpe

संबंधित मुद्दे