python - एक पर्यावरण चर मौजूद है या नहीं, यह जांचने के लिए एक अच्छा अभ्यास क्या है?




python-2.7 python-3.x (2)

मैं अपने पर्यावरण को चर के अस्तित्व के लिए जाँचना चाहता हूँ, "FOO" , पायथन में। इस उद्देश्य के लिए, मैं os मानक पुस्तकालय का उपयोग कर रहा हूं। पुस्तकालय के प्रलेखन को पढ़ने के बाद, मैंने अपने लक्ष्य को प्राप्त करने के 2 तरीके निकाले हैं:

विधि 1:

if "FOO" in os.environ:
    pass

विधि 2:

if os.getenv("FOO") is not None:
    pass

मैं जानना चाहूंगा कि कौन सी विधि, यदि या तो, एक अच्छी / पसंदीदा स्थिति है और क्यों।


पहले का उपयोग करें; यह सीधे जाँच करने की कोशिश करता है कि क्या कुछ environ में परिभाषित किया गया environ । यद्यपि दूसरा रूप समान रूप से अच्छी तरह से काम करता है, यह शब्दार्थ का अभाव है क्योंकि आपको इसका मूल्य मिलता है यदि यह मौजूद है और केवल इसका उपयोग तुलना के लिए करता है।

आप यह देखने की कोशिश कर रहे हैं कि अगर कुछ ई-मेल में मौजूद है , तो आपको इसकी तुलना करने और फिर टॉस करने के लिए क्यों मिलेगा ?

ठीक यही बात getenv करता है:

एक पर्यावरण चर प्राप्त करें , यदि कोई मौजूद नहीं है तो वापस लौटें। वैकल्पिक दूसरा तर्क वैकल्पिक डिफ़ॉल्ट निर्दिष्ट कर सकता है।

(इसका अर्थ यह भी है कि आपका चेक सिर्फ if getenv("FOO") )

आप इसे प्राप्त नहीं करना चाहते, आप इसके अस्तित्व की जांच करना चाहते हैं।

किसी भी तरह से, getenv सिर्फ environ.get आसपास एक आवरण है, लेकिन आप लोगों को मैपिंग में सदस्यता के लिए जाँच करते हुए नहीं देखते हैं:

from os import environ
if environ.get('Foo') is not None:

संक्षेप में, उपयोग करने के लिए:

if "FOO" in os.environ:
    pass

यदि आप अस्तित्व के लिए जाँच करना चाहते हैं, तो, getenv("FOO") उपयोग करें, यदि आप वास्तव में आपके द्वारा प्राप्त मूल्य के साथ कुछ करना चाहते हैं।


या तो समाधान के लिए एक मामला है, आप पर्यावरण चर के अस्तित्व पर सशर्त क्या करना चाहते हैं इसके आधार पर।

मामला एक

जब आप पर्यावरण चर के अस्तित्व के आधार पर विशुद्ध रूप से विभिन्न कार्यों को करना चाहते हैं, तो इसके मूल्य की परवाह किए बिना, पहला उपाय सबसे अच्छा अभ्यास है। यह स्पष्ट रूप से वर्णन करता है कि आप क्या परीक्षण करते हैं: पर्यावरण चर की सूची में 'FOO' है।

if 'KITTEN_ALLERGY' in os.environ:
    buy_puppy()
else:
    buy_kitten()

केस 2

जब आप एक डिफ़ॉल्ट मान सेट करना चाहते हैं यदि मूल्य पर्यावरण में परिभाषित नहीं किया गया है तो दूसरा समाधान वास्तव में उपयोगी है, हालांकि आपके द्वारा लिखे गए फॉर्म में नहीं:

server = os.getenv('MY_CAT_STREAMS', 'youtube.com')

या शायद

server = os.environ.get('MY_CAT_STREAMS', 'youtube.com')

ध्यान दें कि यदि आपके पास आपके आवेदन के लिए कई विकल्प हैं, तो आप ChainMap पर गौर करना चाहते हैं, जो कुंजी के आधार पर कई ChainMap को मर्ज करने की अनुमति देता है। ChainMap प्रलेखन में इसका एक उदाहरण है:

[...]
combined = ChainMap(command_line_args, os.environ, defaults)





environment-variables