多次尝试除非值可能不存在

Multiple Try Except when the value may not be present

我需要检查一个或另一个环境变量。

使用随机变量 - 我可以使用:

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')

因此,它将同时检查它们。但我需要 Var1Var2.

在第一个 try/except 之后添加 if/else,以检查 if r: 第二个调用 try/except 如果没有?威尔看起来很恶心...

os.environ 是一个字典,因此您可以使用 .get 调用它的默认值。

如果您结合使用两个 .get 调用,那么这将为您提供第一个变量,如果它存在(因为 python 短路),否则它将为您提供第二个变量。

所以本质上,代码被简化为:

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

在这种情况下,不需要 try - except 块。

把这个链接稍微长一点,你也可以得到同样给出默认值的表达式:

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

使用 for 循环怎么样?

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

您可以嵌套 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')

对于已知变量(但对于环境变量),您的 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.environdict and dict.get 的签名 dict.get(key, [default]) 其中 default 默认为 None 你可以利用它并得到 None 返回不存在的键( 计算 Falsely)。