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

import imp

try:
    imp.find_module('petsc4py')
    HAVE_PETSC=True
except ImportError:
    HAVE_PETSC=False

फिर मैं अपने बाकी पायथन कोड में HAVE_PETSC का उपयोग कर सकता हूं। यह काम करता है, लेकिन मुझे आश्चर्य है कि क्या यह पायथन में करने का सही तरीका है।

5
aaragon 5 अगस्त 2019, 18:02

2 जवाब

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

हां यह ठीक है। आप सीधे एक आयात भी जारी कर सकते हैं, और मॉड्यूलनाम को ध्वज के रूप में उपयोग कर सकते हैं - जैसे:

try:
    import petsc4py
except ImportError
    petsc4py = None

और किसी भी प्रयोग से पहले, केवल petsc4py की सत्यता का परीक्षण करें।

असल में, जांच कर रहा है कि यह मौजूद है, और उसके बाद ही इसे आयात करने का प्रयास कर रहा है, अनावश्यकता के कारण अनैतिक लगता है, क्योंकि दोनों क्रियाएं एक आयात त्रुटि को समान रूप से ट्रिगर करती हैं। लेकिन चेकिंग के लिए एक HAVE_PETSC वैरिएबल होना ठीक है - इसे HAVE_PETSC = bool(petsc4py) के साथ ऊपर दिए गए प्रयास/छोड़कर बनाया जा सकता है।

7
Timothy Baldwin 5 अगस्त 2019, 20:30

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

आपके मामले में ऐसा करना शायद बेहतर होगा, हालांकि:

try:
    import petsc4py
    HAVE_PETSC = True
except ImportError:
    HAVE_PETSC = False

आपके पास प्रतिमान स्तर पर क्या काम करता है, लेकिन इस मामले में importlib के माध्यम से जाने का कोई वास्तविक कारण नहीं है (और आपको शायद imp का उपयोग नहीं करना चाहिए, क्योंकि यह पाइथन के हाल के संस्करणों में बहिष्कृत है)।

0
Green Cloak Guy 5 अगस्त 2019, 18:10