मैं पूरे कार्यक्रम को रोके बिना आयात किए जा रहे मॉड्यूल के मूल्यांकन को रोकना चाहता हूं।

मैं जो हासिल करना चाहता हूं उसका एक उदाहरण यहां दिया गया है:

main.py

print('main1')
import testmodule
print('main2')

testmodule.py

print(' module1')
some_condition=True
if some_condition:
  exit_from_module()  # How to do this?
print(' module2')     # This line is not executed.

अपेक्षित उत्पादन:

main1
 module1
main2
11
Oleh Prypin 4 जुलाई 2011, 16:27

3 जवाब

सबसे बढ़िया उत्तर

मॉड्यूल के निष्पादन को रोकने का कोई अच्छा तरीका नहीं है। आप अपवाद उठा सकते हैं, लेकिन फिर आपके आयात मॉड्यूल को इससे निपटने की आवश्यकता होगी। शायद इस तरह सिर्फ रिफैक्टर:

print(' module1')
some_condition = True
if not some_condition:
  print(' module2')

अपडेट: इससे भी बेहतर होगा कि आप अपने मॉड्यूल को केवल कार्यों और कक्षाओं को परिभाषित करने के लिए बदलें, और फिर कॉलर को उनमें से किसी एक को उस काम को करने के लिए आमंत्रित करें जिसकी उन्हें आवश्यकता है।

यदि आप वास्तव में आयात के दौरान यह सब काम करना चाहते हैं (याद रखें, मुझे लगता है कि यह बेहतर नहीं होगा), तो आप अपने मॉड्यूल को इस तरह बदल सकते हैं:

def _my_whole_freaking_module():
    print(' module1')
    some_condition = True
    if some_condition:
        return
    print(' module2')

_my_whole_freaking_module()
9
Ned Batchelder 4 जुलाई 2011, 16:58
मेरी स्थिति में मॉड्यूल को बहुत अधिक निकास बिंदुओं की आवश्यकता होती है। शर्तें काम नहीं करेंगी... मैंने इन अपवादों के बारे में भी सोचा, लेकिन मैं अब भी कुछ बेहतर की आशा करता हूं।
 – 
Oleh Prypin
4 जुलाई 2011, 16:31
3
अपने कोड का पुनर्गठन करें। क्या आप सुनिश्चित हैं कि आप वैसे भी कार्यों और कक्षाओं को परिभाषित करने के अलावा और भी कुछ करना चाहते हैं? एक मॉड्यूल आयात करना और आयात के दौरान जटिल क्रियाएं करना थोड़ा अजीब है। मेरा संपादन देखें।
 – 
Ned Batchelder
4 जुलाई 2011, 16:56
मैं एक वेबसाइट बना रहा हूं, और मैं वेबसाइट पर हर तरह की कार्रवाई (जैसे प्रोजेक्ट, ब्लॉग, फोरम) को अलग-अलग करना चाहता हूं। मॉड्यूल। यह सबसे अच्छा तरीका लगा।
 – 
Oleh Prypin
4 जुलाई 2011, 17:00
@BlaXpirit: यह सबसे अच्छा तरीका नहीं है। आपको किसी प्रकार की वेबफ्रेमवर्क की आवश्यकता है। मुझे लगता है कि अब आप सीजीआई का उपयोग कर रहे हैं? मत करो। सीजीआई ब्रेनडेड है।
 – 
Lennart Regebro
4 जुलाई 2011, 17:29
मुझे बस उन ढांचे से नफरत है। वे मुझे बहुत ज्यादा प्रतिबंधित करते हैं और किसी काम के नहीं हैं। पायथन 3 के साथ मैं महान प्रोग्राम लिखने के लिए स्वतंत्र हूं जो बड़े पैमाने पर यूनिकोड का उपयोग करते हैं
 – 
Oleh Prypin
4 जुलाई 2011, 18:20

मेरा main.py इस तरह दिखता है,

print 'main 1'

try:
    import my_module
except ImportError:
    pass

print 'main 2'

और my_module.py इस तरह दिखता है,

print 'module 1'

if True:
    raise ImportError
else:
    pass

print 'module 2'

आउटपुट है,

main 1
module 1
main 2
5
lafras 4 जुलाई 2011, 16:38
1
यह समस्या का एकमात्र सही पायथन समाधान है। धन्यवाद!
 – 
Erik Aronesty
5 अक्टूबर 2017, 16:02

आप मॉड्यूल कोड को फ़ंक्शन के अंदर लपेट सकते हैं, जैसे:

def main():
  print(' module1')
  some_condition=True
  if some_condition:
    return
  print(' module2')

main()
2
Harriv 4 जुलाई 2011, 16:31
3
एक और समस्या यह है कि मुख्य रूप से सभी चर को वैश्विक घोषित किया जाना चाहिए ताकि इसे पहले जैसा ही काम किया जा सके।
 – 
iuradz
12 मई 2015, 20:59