पहले से ही फ्लैट पैकेज का उपयोग करने के बाद, मैं नेस्टेड पैकेज के साथ सामना करने वाले मुद्दे की उम्मीद नहीं कर रहा था। यहाँ है…
निर्देशिका लेआउट
dir
|
+-- test.py
|
+-- package
|
+-- __init__.py
|
+-- subpackage
|
+-- __init__.py
|
+-- module.py
Init .py की सामग्री
दोनों package/__init__.py
और package/subpackage/__init__.py
खाली हैं।
की सामग्री module.py
# file `package/subpackage/module.py`
attribute1 = "value 1"
attribute2 = "value 2"
attribute3 = "value 3"
# and as many more as you want...
सामग्री test.py
(3 संस्करण)
संस्करण 1
# file test.py
from package.subpackage.module import *
print attribute1 # OK
यह चीजों को आयात करने का बुरा और असुरक्षित तरीका है (सभी को थोक में आयात करें), लेकिन यह काम करता है।
संस्करण 2
# file test.py
import package.subpackage.module
from package.subpackage import module # Alternative
from module import attribute1
आइटम द्वारा आइटम आयात करने का एक सुरक्षित तरीका, लेकिन यह विफल रहता है, पायथन यह नहीं चाहता है: संदेश के साथ विफल रहता है: "मॉड्यूल के बिना कोई मॉड्यूल नहीं"। तथापि …
# file test.py
import package.subpackage.module
from package.subpackage import module # Alternative
print module # Surprise here
… कहता है <module 'package.subpackage.module' from '...'>
। तो यह एक मॉड्यूल है, लेकिन यह एक मॉड्यूल / -P 8-O ... उह नहीं है
संस्करण 3
# file test.py v3
from package.subpackage.module import attribute1
print attribute1 # OK
यह काम करता है। तो आप या तो हर समय ओवरकिल उपसर्ग का उपयोग करने के लिए मजबूर होते हैं या असुरक्षित तरीके से संस्करण # 1 का उपयोग करते हैं और सुरक्षित आसान तरीका का उपयोग करने के लिए पायथन द्वारा अस्वीकृत कर दिया जाता है? बेहतर तरीका, जो सुरक्षित है और अनावश्यक लंबे उपसर्ग से बचता है, केवल वही है जिसे पायथन अस्वीकार करता है? क्या यह इसलिए है क्योंकि यह प्यार करता है import *
या क्योंकि यह प्रीफिक्स से अधिक प्यार करता है (जो इस अभ्यास को लागू करने में मदद नहीं करता है)।
कठिन शब्दों के लिए क्षमा करें, लेकिन यह दो दिन है जब मैं इस मूर्खतापूर्ण व्यवहार के आसपास काम करने की कोशिश कर रहा हूं। जब तक मैं कहीं पूरी तरह से गलत नहीं था, यह मुझे एक एहसास के साथ छोड़ देगा कि पायथन के पैकेज और उप sub पैकेज के मॉडल में वास्तव में कुछ टूट गया है।
टिप्पणियाँ
- मैं
sys.path
वैश्विक दुष्प्रभावों से बचने के लिए, और न ही*.pth
फाइलों पर भरोसा नहीं करना चाहता , जो एकsys.path
ही वैश्विक पुतलों के साथ खेलने का एक और तरीका है । स्वच्छ होने के समाधान के लिए, यह केवल स्थानीय होना है। या तो पायथन उप-पैकेज को संभालने में सक्षम है, या तो यह नहीं है, लेकिन इसे स्थानीय सामान को संभालने में सक्षम होने के लिए वैश्विक कॉन्फ़िगरेशन के साथ खेलने की आवश्यकता नहीं होनी चाहिए। - मैंने भी आयात का उपयोग करने की कोशिश की
package/subpackage/__init__.py
, लेकिन यह कुछ भी हल नहीं किया, यह वही करता है, और शिकायतsubpackage
एक ज्ञात मॉड्यूल नहीं है, जबकिprint subpackage
यह एक मॉड्यूल (अजीब व्यवहार, फिर से) कहता है।
हो सकता है कि मैं पूरी तरह से गलत हूं (विकल्प मैं पसंद करूंगा), लेकिन इससे मुझे पायथन के बारे में बहुत निराशा हुई।
मैंने कोशिश की तीनों के पास कोई अन्य ज्ञात तरीका? कुछ मैं जिसके बारे में नहीं जानता?
(आह)
-----% <----- संपादित करें ----->% -----
अब तक का निष्कर्ष (लोगों की टिप्पणियों के बाद)
पायथन में वास्तविक उप ‑ पैकेज जैसा कुछ भी नहीं है, क्योंकि सभी पैकेज संदर्भ एक वैश्विक डिक्शनरी में जाते हैं, केवल, जिसका अर्थ है कि कोई स्थानीय शब्दकोष नहीं है, जिसका अर्थ है कि स्थानीय पैकेज संदर्भ को प्रबंधित करने का कोई तरीका नहीं है।
आपको या तो पूर्ण उपसर्ग या लघु उपसर्ग या उपनाम का उपयोग करना होगा। जैसे की:
पूर्ण उपसर्ग संस्करण
from package.subpackage.module import attribute1
# An repeat it again an again
# But after that, you can simply:
use_of (attribute1)
लघु उपसर्ग संस्करण (लेकिन दोहराया उपसर्ग)
from package.subpackage import module
# Short but then you have to do:
use_of (module.attribute1)
# and repeat the prefix at every use place
या फिर, उपरोक्त का एक रूपांतर।
from package.subpackage import module as m
use_of (m.attribute1)
# `m` is a shorter prefix, but you could as well
# define a more meaningful name after the context
फैक्टरेटेड संस्करण
यदि आप एक बैच में एक साथ कई इकाई आयात करने के बारे में बुरा नहीं मानते हैं, तो आप यह कर सकते हैं:
from package.subpackage.module import attribute1, attribute2
# and etc.
मेरे पहले पसंदीदा स्वाद में नहीं (मैं प्रति आयातित इकाई के लिए एक आयात विवरण रखना पसंद करता हूं), लेकिन हो सकता है कि मैं व्यक्तिगत रूप से एहसान करूं।
अपडेट (2012-09-14):
लेआउट के बारे में एक टिप्पणी के अलावा, अंत में व्यवहार में ठीक प्रतीत होता है। उपरोक्त के बजाय, मैंने उपयोग किया:
from package.subpackage.module import (
attribute1,
attribute2,
attribute3,
...) # and etc.