2009-02-18 11 views
18

मैं जिथब पर सॉफ़्टवेयर का एक टुकड़ा लिख ​​रहा हूं। यह मूल रूप से कुछ अतिरिक्त सुविधाओं के साथ एक ट्रे आइकन है। मैं वास्तव में उपयोगकर्ता को स्थापित करने के बिना कोड का एक वर्किंग टुकड़ा प्रदान करना चाहता हूं जो वैकल्पिक सुविधाओं के लिए अनिवार्य रूप से निर्भरता है और मैं वास्तव में उन चीज़ों को आयात नहीं करना चाहता हूं जिन्हें मैं उपयोग नहीं कर रहा हूं, इसलिए मैंने सोचा कि इस तरह का कोड " अच्छा समाधान ":वैकल्पिक सुविधाओं को आयात करने और पेश करने के लिए पाइथन अच्छा अभ्यास क्या है?

---- 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 नहीं चाहता है .... यह वैसे भी भरी हुई है।

तो लोग इस समस्या को हल करने का सबसे अच्छा तरीका क्या सोचते हैं?

उत्तर

10

आप imp module पर एक नज़र डालना चाहते हैं, जो मूल रूप से आप जो करते हैं वह मूल रूप से करता है। तो आप पहले find_module() के साथ एक मॉड्यूल की तलाश कर सकते हैं और उसके बाद इसे load_module() या इसे आयात करके (कॉन्फ़िगरेशन की जांच के बाद) लोड कर सकते हैं।

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

36

try: विधि को वैश्विक होने की आवश्यकता नहीं है - इसका उपयोग किसी भी दायरे में किया जा सकता है और इसलिए मॉड्यूल रनटाइम पर "आलसी लोड" हो सकते हैं। उदाहरण के लिए:

def foo(): 
    try: 
     import external_module 
    except ImportError: 
     pass 

    if external_module: 
     external_module.some_whizzy_feature() 
    else: 
     print "You could be using a whizzy feature right now, if you had external_module." 

जब अपनी स्क्रिप्ट चलाया जाता है, कोई प्रयास external_module लोड करने के लिए किया जाएगा। पहली बार foo() कहा जाता है, external_module (यदि उपलब्ध हो) लोड किया गया है और फ़ंक्शन के स्थानीय दायरे में डाला गया है। बाद में कॉल foo() मॉड्यूल को फिर से लोड करने की आवश्यकता के बिना अपने दायरे में external_module पुन: सम्मिलित करें।

सामान्यतः, पाइथन को आयात तर्क को संभालने के लिए सबसे अच्छा है - यह थोड़ी देर के लिए ऐसा कर रहा है। :-)

+8

मुझे लगता है कि 'ImportError को छोड़कर' ब्लॉक को 'बाहरी_ मॉड्यूल = कोई नहीं' सेट करने की आवश्यकता है या यदि आप ब्लॉक में इसे एक्सेस करने का प्रयास करते हैं तो आपको 'NameError' मिल जाएगा। – abhishekmukherg

+0

बहुत पसंद है, कोशिश करें: सिवाय इसके कि: (बिना अपवाद प्रकार के), एक विरोधी पैटर्न है, आयात करने वाला आयातर जो भी आप चाहते हैं वह नहीं हो सकता है। यदि मॉड्यूल मौजूद है, लेकिन अपवाद उठाता है, तो आप इसे पकड़ लेंगे और त्रुटि को छिपाते रहेंगे। मॉड्यूल के अस्तित्व की जांच करने के लिए यह बेहतर है, तय करें कि क्या आप इसे आयात करना चाहते हैं, और फिर * आयात करें * आयात करें – user48956

0

विभिन्न सुविधाओं के लिए विभिन्न निर्भरताओं की समस्या को संभालने का एक तरीका है प्लगइन के रूप में वैकल्पिक सुविधाओं को लागू करना। इस तरह उपयोगकर्ता पर नियंत्रण है कि ऐप में कौन सी सुविधाएं सक्रिय की गई हैं लेकिन निर्भरताओं को स्वयं ट्रैक करने के लिए ज़िम्मेदार नहीं है। तब उस कार्य को प्रत्येक प्लगइन की स्थापना के समय संभाला जाता है।

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

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