2015-06-09 3 views
1

Мне нужно проверить ту или иную переменную среды.Несколько Try За исключением случаев, когда это значение может отсутствовать

С случайными переменными - я могу использовать:

if var1: 
    print('Var1 found') 
elif var2: 
    print('Var2 found') 
else: 
    print('Neither Var1 nor Var2 not found') 

Как я могу сделать то же самое для переменных окружения?

Я не могу использовать if/else, из-за, если переменная не найдена - os.environ будет Raize KeyError:

File "C:\Python27\lib\os.py", line 425, in __getitem__ 
    return self.data[key.upper()] 
KeyError: 'BAMBOO_WORKING_DIRECTORY' 

Если я сделаю два try/except, как:

try: 
    r = os.environ['Var1'] 
except KeyError as error: 
    print('Var1 not found') 

try: 
    r = os.environ['Var2'] 
except KeyError as error: 
    print('Var2 not found') 

Так что, проверит их оба. Но мне нужно Var1 или Var2.

Добавить if/else после первой попытки/кроме, проверить if r: звонок второй try/except если нет? Будет выглядеть отвратительно ...

+1

Используйте '' os.environ.get (ключ, по умолчанию) ''. например: '' if os.environ.get ("FOO", None): '' –

+0

@JamesMills Вы могли бы добавить это как ответ? – setevoy

ответ

1

точный эквивалент вашей if/elif для известных переменных (но для переменных среды) будет:

from os import environ 

if environ.get("VAR1"): 
    print('VAR1 found') 
elif environ.get("VAR2"): 
    print('VAR2 found') 
else: 
    print('Neither VAR1 nor VAR2 not found') 

С os.environ - dict и dict.get имеет подпись dict.get(key, [default]) где default по умолчанию None вы можете воспользоваться этим и получить обратно None для ключа (ей), которые не существуют (которые оценивают False лы).

4

os.environ - это dict, поэтому вы можете использовать вызов .get по умолчанию со значением по умолчанию.

Если вы используете два вызова .get в соединении, то это даст вам первую переменную, если она присутствует (из-за короткого замыкания на питоне), иначе она будет вам второй.

Так по существу, код упрощается:

r = os.environ.get('Var1', "") or os.environ.get('Var2', "") 

В этом случае нет необходимости в попытке - за исключением блока.

цепи это немного больше, и вы можете получить выражение, которое даст значение по умолчанию, а также:

>>> r = os.environ.get('Var1', "") or os.environ.get('Var2', "") or (
    "Neither Var1 nor Var2 not found") 
1

Как об использовании for цикла?

for varname in ['Var1', 'Var2']: 
    try: 
     r = os.environ['Var1'] 
     break 
    except KeyError as error: 
     print('{} not found'.format(varname)) 
0

Вы можете вложить свои try заявления

try: 
    r = os.environ['Var1'] 

    try: 
     r = os.environ['Var2'] 
    except KeyError as error: 
     print('Var2 not found') 

except KeyError as error: 
    print('Var1 not found') 

 Смежные вопросы

  • Нет связанных вопросов^_^