পরিবেশগত পরিবর্তনশীল উপস্থিত রয়েছে কিনা তা যাচাই করার জন্য একটি ভাল অনুশীলন কী?


130

"FOO"পাইথনে বলুন , আমি একটি ভেরিয়েবলের অস্তিত্বের জন্য আমার পরিবেশটি পরীক্ষা করতে চাই । এই উদ্দেশ্যে, আমি osস্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করছি । গ্রন্থাগারের ডকুমেন্টেশন পড়ার পরে, আমি আমার লক্ষ্য অর্জনের জন্য 2 টি উপায় বের করেছি:

পদ্ধতি 1:

if "FOO" in os.environ:
    pass

পদ্ধতি 2:

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

আমি জানতে চাই কোন পদ্ধতিটি যদি হয় তবে একটি ভাল / পছন্দসই শর্তযুক্ত এবং কেন।


এটি মূলত মতামত ভিত্তিক। উভয়ই একই উদ্দেশ্যে পরিবেশন করে। আমি ক্লিনার হিসাবে পদ্ধতিটি 1 পছন্দ করব
কাদেরি

1
আমি এর মধ্যে কিছু আছে বলতে পারি না। একটি বাছুন (একটি মুদ্রা ফ্লিপ করুন?) এবং যদি কাজ না করে দেখা যায় তবে পরে পুনরায় মূল্যায়ন করুন। সত্যিই আমি মনে করি আপনি যে কোনও উপায়ে বাঁচাতে চেয়ে এই প্রশ্নটি টাইপ করতে আপনি বেশি সময় ব্যয় করেছেন!
jonrsharpe

1
@ আইয়ুব: আমার মনে হয় আপনি "
কাদেরি

1
মতামত ভিত্তিক। পদ্ধতি 1 সিনট্যাক্সটি আরও ভাল কাজ করে, যেহেতু আপনি জিজ্ঞাসা fooকরেন যে এনভ ভার্সে রয়েছে কিনা, মানগুলির fooফলাফলের সন্ধানের ক্ষেত্রে নয় None
ইউরিয়েল

1
তবে আপনি যদি ডাচ না করেন তবে এই
পথটি

উত্তর:


168

প্রথম ব্যবহার করুন; এটি সরাসরি কিছু সংজ্ঞায়িত হয়েছে কিনা তা খতিয়ে দেখার চেষ্টা করে environ। যদিও দ্বিতীয় ফর্মটি সমানভাবে ভাল কাজ করে তবে এটি শব্দার্থভাবে অভাবের কারণ আপনি যদি একটি মান উপস্থিত থাকেন তবে এটি কেবল তুলনার জন্য ব্যবহার করুন।

আপনি যদি কিছু উপস্থিত দেখতে চেষ্টা করছেন মধ্যে environ , কেন তুমি হবে পেতে শুধু এটা তুলনা এবং তারপর এটি দূরে শিরসঁচালন ?

ঠিক এটাই getenvকরে:

পরিবেশের পরিবর্তনশীল পান , Noneউপস্থিত না থাকলে ফিরে আসুন। Alচ্ছিক দ্বিতীয় আর্গুমেন্ট একটি বিকল্প ডিফল্ট নির্দিষ্ট করতে পারে।

(এটির অর্থ আপনার চেকটিও হতে পারে 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")আপনি যদি পেতে পারেন এমন মূল্য দিয়ে বাস্তবে কিছু করতে চান তবে ব্যবহার করুন ।


2
তোমার ব্যাখ্যার জন্য ধন্যবাদ. আমি এটা মনে রাখব।
ক্ষিতিজ সরোগি

29

উভয় সমাধানের ক্ষেত্রে একটি পরিবেশ রয়েছে যা আপনি পরিবেশের পরিবর্তনশীলের অস্তিত্বের উপর শর্তসাপেক্ষে কী করতে চান তার উপর নির্ভর করে।

মামলা 1

যখন আপনি পরিবেশের পরিবর্তনশীলের অস্তিত্বের ভিত্তিতে বিশুদ্ধরূপে এর মানটির যত্ন নিই না করে আলাদা আলাদা পদক্ষেপ নিতে চান, তখন প্রথম সমাধানটি সেরা অনুশীলন। এটি আপনার জন্য যা পরীক্ষা করে তা সংক্ষেপে বর্ণনা করে: পরিবেশ ভেরিয়েবলের তালিকায় '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ডকুমেন্টেশনে এর একটি উদাহরণ রয়েছে :

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

15

নিরাপদ দিকে ব্যবহার হতে

os.getenv('FOO') or 'bar'

উপরের উত্তরগুলির সাথে একটি কোণার ক্ষেত্রটি হল যখন পরিবেশের পরিবর্তনশীল সেট করা থাকে তবে খালি থাকে

এই বিশেষ ক্ষেত্রে আপনি পেতে

print(os.getenv('FOO', 'bar'))
# prints new line - though you expected `bar`

অথবা

if "FOO" in os.environ:
    print("FOO is here")
# prints FOO is here - however its not

এটি কেবল ব্যবহার এড়াতে or

os.getenv('FOO') or 'bar'

তাহলে তুমি পাও

print(os.getenv('FOO') or 'bar')
# bar

আমাদের কখন খালি পরিবেশের পরিবর্তনশীল থাকে?

আপনি .envফাইলটিতে মান সেট করতে ভুলে গেছেন

# .env
FOO=

বা হিসাবে রফতানি

$ export FOO=

বা সেট করতে ভুলে গেছেন settings.py

# settings.py
os.environ['FOO'] = ''

আপডেট: সন্দেহ হলে এই ওয়ান-লাইনারগুলি পরীক্ষা করে দেখুন

>>> import os; os.environ['FOO'] = ''; print(os.getenv('FOO', 'bar'))

$ FOO= python -c "import os; print(os.getenv('FOO', 'bar'))"

জেন্তেভের স্বাক্ষরটি def getenv(key, default=None):তাই যদি তাই হয় যে শুরুতে ডিফল্ট বনাম বা সিনট্যাক্সের অনুমতি দেওয়া উচিত
ক্রিস ম্যাককি

@ ক্রিস ম্যাকিকে এটি চেষ্টা করুন>>> import os; os.environ['FOO'] = ''; print(os.getenv('FOO', 'bar'))
লেভন

বিভ্রান্তিমূলক পদ্ধতিতে স্বাক্ষর 😜
ক্রিস ম্যাককি

1
@ ক্রিস ম্যাককি, অন্য একটি উদাহরণ$ FOO= python -c "import os; print(os.getenv('FOO', 'bar'))"
লেভন

3

আপনি যদি একাধিক এনভির ভেরিয়েবল সেট না করে থাকেন তা পরীক্ষা করতে চান তবে আপনি নিম্নলিখিতটি করতে পারেন:

import os

MANDATORY_ENV_VARS = ["FOO", "BAR"]

for var in MANDATORY_ENV_VARS:
    if var not in os.environ:
        raise EnvironmentError("Failed because {} is not set.".format(var))

-1

আমার মন্তব্য দেওয়া ট্যাগগুলির সাথে প্রাসঙ্গিক নাও হতে পারে। যাইহোক, আমি আমার অনুসন্ধান থেকে এই পৃষ্ঠাতে নেতৃত্ব দিয়েছিলাম। আমি আর তে অনুরূপ চেক খুঁজছিলাম এবং আমি @ হুগোভডবেগ পোস্টের সাহায্যে নিম্নলিখিতটি পেয়েছি। আমি আশা করি যে এটি আর এর মতো একই সমাধান খুঁজছেন তাদের পক্ষে সহায়ক হবে

'USERNAME' %in% names(Sys.getenv())
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.