मैं निम्नलिखित है पैकेज संरचना के बिना एक सबपैकेज आयातअजगर दूसरों
package
__init__.py
sub1
__init__.py
foo.py # Contains class Foo
sub2
__init__.py
bar.py # Contains class Bar
मैं चाहता हूँ बस import package
और package.Foo
और package.Bar
के लिए सक्षम होने के लिए है, यानी मैं सबपैकेज उपयोगकर्ताओं के लिए पारदर्शी होना चाहते हैं।
पकड़ यह है कि उप 2 आयात करने में काफी समय लगता है, और कई उपयोगकर्ता उप 2 में सामान के बारे में बिल्कुल परवाह नहीं करते हैं और केवल सामान को उप 1 में चाहते हैं। इस प्रकार मैं चाहता हूं कि उपयोगकर्ता import package.sub1
या from package import sub1
से पर केवल आयात उप 1 और उप 2 के आयात को छोड़ने में सक्षम हों।
मैं जानता हूँ कि मैं package/__init__.py
होने से पहले भाग प्राप्त कर सकते हैं शामिल
from .sub1 import *
from .sub2 import *
और package/sub1/__init__.py
sub2 के लिए from .foo import Foo
हो सकता है और इसी तरह हो रही है। हालांकि, यह हमेशा उप-1 और उप 2 आयात करेगा, भले ही उपयोगकर्ता केवल package.sub1
आयात करने का प्रयास करता हो।
अनुरूप बात यह है कि मैं package/__init__.py
खाली होने और दूसरे के समान sub1/__init__.py
का उपयोग करके दूसरे भाग को प्राप्त कर सकता हूं। हालांकि, बस कह रहे हैं कि import package
उप 1 या उप 2 लोड नहीं करता है, इसलिए उपयोगकर्ताओं को उन्हें स्पष्ट रूप से लोड करना होगा और फिर package.sub1.Foo
देखें।
आदर्श रूप से एक समाधान 2.7.10 और 3.5.0 दोनों में काम करेगा, लेकिन यदि दोनों संभव नहीं हैं तो मैं एक या दूसरे को स्वीकार करूंगा।
में यह करने का आधिकारिक तरीका है एक बेहतर सवाल यह है कि आपके पास 'sub2' – jfs
में मॉड्यूल स्तर पर एक लंबे समय से चलने वाला कोड क्यों है, वास्तव में, आपका प्रश्न है : "मैं 'आयात पैकेज' की तुलना में कड़ाई से कम चीजें करने के लिए 'import package.sub1' आयात करना चाहता हूं, है ना? कुछ अजीब हैक को पहले से बाइटकोड पढ़ने की तरह, मुझे लगता है कि यह संभव नहीं है।' आयात एबी 'को' ए आयात करना ' पहले। https: // दस्तावेज़ों के नीचे नोट करें।python.org/3.6/library/importlib.html (अंतिम कोड ब्लॉक, लाइन 15), 'import_module' एक पुनरावर्ती कार्य है। हालांकि, आप आसानी से एक तिहाई उप-पैकेज, 'package.everything' कर सकते हैं, जो वास्तव में उसी नामस्थान में' sub1' और 'sub2' आयात करेगा। – Veky
@ वेकी: वास्तव में मैं वास्तव में क्या कर रहा हूं (ठीक है, 'पैकेज.ल', लेकिन पर्याप्त बंद करें) – Alec