2011-11-17 19 views
6

मेरे पास एक प्रश्न है जो मूलभूत प्रतीत होता है लेकिन मुझे कहीं भी इस पर कोई मदद नहीं मिल रही है।मॉड्यूल और वैश्विक चरों में पाइथन आयात

file_a.py >> 

from xyz import XYZ 
class A: 
    . 
    . 
    . 

file_b.py >> 

import file_a 
from file_a import A 
class B(A): 
    def __init__(self): 
     A.__init__(self) 

    def someMethod(self): 
     XYZ.doSomething() 

XYZ.doSomething() कह NameError विफल रहता है: नाम 'XYZ' की तरह 'आयात sys' file_a से किया यहां तक ​​कि मानक के आयात से परिभाषित नहीं है यह file_b में प्रयोग करने योग्य रेंडर करने के लिए प्रतीत नहीं होता। मैंने माना कि काम करना चाहिए। क्या मेरी समझ गलत है? यदि हां, तो फाइलों में आम आयात और वैश्विक चर रखने का कोई तरीका है? (यदि यह कोई मदद नहीं है, तो मैं एक सी ++ और जावा प्रोग्रामर रहा हूं और अब पाइथन का उपयोग शुरू कर रहा हूं।)

उत्तर

5

Is my understanding wrong?

हाँ, क्योंकि लाइन from file_a import A आयात केवल file_b का नाम स्थान में वर्ग Afile_a का नामस्थान अकेला छोड़ दिया गया है। यह इस तरह नहीं कर रहे थे, वहाँ दोनों वाक्य रचना होने में थोड़ा समझ में होगा:

import modulename 
from modulename import something 

अपनी सोच के रूप में यदि सही था, तो दूसरा रूप के बाद आप हमेशा modulename.someotherthing उपयोग करने में सक्षम हो जाएगा।

If yes, then is there a way to have common imports and global variables across files?

हाँ, स्टार * ऑपरेटर के साथ:

from modulename import * 

लेकिन इस नाम स्थान प्रदूषण के मुद्दे, उदाहरण के लिए from file_a import *file_b में भी सभी आयातों file_a में किया आयात करेगा लाता है। आप अंततः आपके आयात पर नियंत्रण खो देंगे और यह आपको कुछ समय में काट देगा ... इस पर मेरा विश्वास करो!

जब के लिए किसी कारण from module import * की जरूरत है, नाम स्थान प्रदूषण के लिए एक वैकल्पिक हल modulevariable __all__ में परिभाषित करने के लिए है, जो श्वेतसूची क्या स्टार ऑपरेटर के साथ आयातित किया जाना चाहिए।

एचटीएच!

4

जब आप मॉड्यूल आयात करते हैं, तो उस मॉड्यूल में परिभाषित सभी चर इसके नामस्थान में उपलब्ध हैं। इसलिए, XYZfile_a मॉड्यूल में उपलब्ध है, जब आप import file_a पर XYZfile_a.XYZ पर पहुंच सकते हैं।

सामान्य विचार यह है कि आपका नामस्थान अन्य नामस्थानों की सामग्री से अव्यवस्थित नहीं होना चाहिए।

1
import file_a 
from file_a import A 

मुझे लगता है कि समस्या यह है: आप वास्तव में XYZ आयात नहीं करते हैं!

from fila_a import * 

आपकी समस्या का समाधान कर सकते हैं, लेकिन यह एक अच्छा तरीका है ~~~

आप file_b में यह लिख सकते हैं नहीं है:

from file_a import XYZ 

यह किया जाता है?

3

हां, आपकी समझ गलत है। प्रत्येक मॉड्यूल का अपना नामस्थान होता है, और केवल उस फ़ाइल में स्पष्ट रूप से आयात करने वाली चीजें उस नामस्थान में उपलब्ध होती हैं।

अन्य उत्तरों के विपरीत, यह file_a.XYZ को संदर्भित करने के लिए विशेष रूप से पाइथोनिक नहीं है, हालांकि यह काम करेगा। इसके बजाय, आपको file_b के शीर्ष पर XYZ और sys आयात करना चाहिए।

+0

वैसे यह मेरा सवाल है। मैं file_b जैसी कई फाइलों में आयात के एक सेट को दोहराने से बचना चाहता हूं। मुझे पता है कि XYZ और sys को file_b कार्यों में आयात करना। – ksrini

+1

@ksrini आपको यह नहीं चाहिए। मॉड्यूल का उपयोग करने वाली सभी चीज़ों को स्पष्ट रूप से आयात करना अच्छा होता है। यह अच्छी तरह से एक ही स्थान पर सभी निर्भरताओं को सूचीबद्ध करता है। पीईपी 20 देखें - निहित से स्पष्ट स्पष्ट है। – yak

+0

धन्यवाद याक, यह दिलचस्प और अंतर्दृष्टिपूर्ण था! – ksrini

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