比这个嵌套的 try-except 语句更好的方法?

A better way than this nested try-except statement?

我有这个接收国家输入的代码:

flag1 = input("Enter country 1: ")
   while not worked:
      worked = True
      try:
         code1 = pycountry.countries.get(name=flag1).alpha_2
      except AttributeError:
         try:
            code1 = pycountry.countries.get(official_name=flag1).alpha_2
         except AttributeError:
            print("Invalid Input. Visit --- for list of country names.")
            flag1 = input()
            worked = False

我计划再添加两种输入国家/地区的方式(通过 2/3 字母代码),因此我将再添加 2 个 try-except 语句。是否有更简单、更简单的方法来执行此检查,而无需嵌套其中的 4 个语句?

像下面这样的东西可以工作:

lookups = [
    lambda x: pycountry.countries.get(name=x).alpha_2,
    lambda x: pycountry.countries.get(official_name=x).alpha_2
]

flag1 = input("Enter country 1: ")

worked = False
code1 = None

while not worked:
    for lookup in lookups:
        try:
            code1 = lookup(flag1)
        except:
            continue
        
        worked = True
        break
    
    if not worked:
        print("Invalid Input. Visit --- for list of country names.")
        flag1 = input()

另一种方法是使用 pycountry 的模糊搜索功能或 here 中所述的查找,这样您就可以在不指定要搜索的字段的情况下进行搜索。这可能适合也可能不适合您的案例.

pycountry.countries.lookup('de')
<pycountry.db.Country object at 0x...>

这就是您所需要的。不包含 try-except。

import pycountry
code_1 =''
while True:
  flag1 = input("Enter country 1: ")
  aux = pycountry.countries.get(name=flag1) or pycountry.countries.get(official_name=flag1)
  if aux ==None:
    print("Invalid Input. Visit --- for list of country names.")
    continue
  code1 = aux.alpha_2
  break
print(code1)