मैं जिथब पर सॉफ़्टवेयर का एक टुकड़ा लिख रहा हूं। यह मूल रूप से कुछ अतिरिक्त सुविधाओं के साथ एक ट्रे आइकन है। मैं वास्तव में उपयोगकर्ता को स्थापित करने के बिना कोड का एक वर्किंग टुकड़ा प्रदान करना चाहता हूं जो वैकल्पिक सुविधाओं के लिए अनिवार्य रूप से निर्भरता है और मैं वास्तव में उन चीज़ों को आयात नहीं करना चाहता हूं जिन्हें मैं उपयोग नहीं कर रहा हूं, इसलिए मैंने सोचा कि इस तरह का कोड " अच्छा समाधान ":वैकल्पिक सुविधाओं को आयात करने और पेश करने के लिए पाइथन अच्छा अभ्यास क्या है?
---- IN LOADING FUNCTION ----
features = []
for path in sys.path:
if os.path.exists(os.path.join(path, 'pynotify')):
features.append('pynotify')
if os.path.exists(os.path.join(path, 'gnomekeyring.so')):
features.append('gnome-keyring')
#user dialog to ask for stuff
#notifications available, do you want them enabled?
dlg = ConfigDialog(features)
if not dlg.get_notifications():
features.remove('pynotify')
service_start(features ...)
---- SOMEWHERE ELSE ------
def service_start(features, other_config):
if 'pynotify' in features:
import pynotify
#use pynotify...
हालांकि कुछ समस्याएं हैं। यदि कोई उपयोगकर्ता अपनी मशीन को प्रारूपित करता है और अपने ओएस का नवीनतम संस्करण स्थापित करता है और इस एप्लिकेशन को फिर से तैनात करता है, तो अचानक बिना किसी चेतावनी के गायब हो जाते हैं। समाधान विन्यास खिड़की पर यह पेश करने के लिए है:
if 'pynotify' in features:
#gtk checkbox
else:
#gtk label reading "Get pynotify and enjoy notification pop ups!"
लेकिन अगर यह कहते हैं, एक मैक है, मैं कैसे पता है कि मैं एक निर्भरता वे कभी नहीं कर सकते हैं की तलाश में एक जंगली हंस का पीछा करने पर उपयोगकर्ता नहीं भेज रहा हूं भरने?
if os.path.exists(os.path.join(path, 'gnomekeyring.so')):
मुद्दा:
दूसरी समस्या है। क्या मैं सुनिश्चित कर सकता हूं कि फ़ाइल को हमेशा linome distring.so में सभी linux distros कहा जाता है?
अन्य लोग इन सुविधाओं का परीक्षण कैसे करते हैं? बुनियादी
try:
import pynotify
except:
pynotify = disabled
साथ समस्या यह है कि कोड वैश्विक है, इन चारों ओर अटे पड़े हो सकता है और भले ही उपयोगकर्ता pynotify नहीं चाहता है .... यह वैसे भी भरी हुई है।
तो लोग इस समस्या को हल करने का सबसे अच्छा तरीका क्या सोचते हैं?
मुझे लगता है कि 'ImportError को छोड़कर' ब्लॉक को 'बाहरी_ मॉड्यूल = कोई नहीं' सेट करने की आवश्यकता है या यदि आप ब्लॉक में इसे एक्सेस करने का प्रयास करते हैं तो आपको 'NameError' मिल जाएगा। – abhishekmukherg
बहुत पसंद है, कोशिश करें: सिवाय इसके कि: (बिना अपवाद प्रकार के), एक विरोधी पैटर्न है, आयात करने वाला आयातर जो भी आप चाहते हैं वह नहीं हो सकता है। यदि मॉड्यूल मौजूद है, लेकिन अपवाद उठाता है, तो आप इसे पकड़ लेंगे और त्रुटि को छिपाते रहेंगे। मॉड्यूल के अस्तित्व की जांच करने के लिए यह बेहतर है, तय करें कि क्या आप इसे आयात करना चाहते हैं, और फिर * आयात करें * आयात करें – user48956