Как поймать keyerror и выполнить остальную часть кода, если keyerror равен нулю

Я пытаюсь написать функцию, которая проверяет, является ли данная переменная названием страны, названием города или каким-то мусорным словом. сначала я проверяю, является ли переменная названием страны. для этого я использую API. Если переменной нет в списке названий стран, я хочу проверить ее в списке названий городов. Проблема в том, что если имя переменной не существует, она возвращает ключевую ошибку: ошибка 0, и я не могу перейти к ней и вставить код проверки имени города. Есть ли способ обойти это? это я уже устал

def searchCountry():
    try:
        address = 'berlin'
        checkcountry = 'https://restcountries.com/v3.1/name/' + address 
        json_data = requests.get(checkcountry).json()
        new_address  = json_data[0]['name']['common']
    except KeyError as e:
        try:
            if e == 0:
                checkcities =  'https://countriesnow.space/api/v0.1/countries'
                json_data = requests.get(checkcities).json()
                cities_list = []
                for i in range(0,len(json_data['data'])):
                    list = json_data['data'][i]['cities']
                    cities_list.append(list)
                new_list=sum(cities_list, [])
                for item in new_list:
                    if address == item:
                        return address
                    else:
                        print('error')
        except:
            pass

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

JonSG 17.03.2022 21:29

Да, конечно, если хочешь @JonSG

user123 17.03.2022 21:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
27
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Хотя это не гарантируется от повторного использования другими типами, dict сгенерированные KeyError передают отсутствующий ключ в качестве единственного аргумента конструктору для KeyError и, как и все исключения, сохраняют свои аргументы как tuple в атрибуте .args. Итак, все, что вам нужно сделать, это заменить:

if e == 0:

с:

if e.args[0] == 0:
# Or to be absolutely sure it wasn't constructed with additional arguments:
if e.args == (0,):  # Trailing comma mandatory to make it an actual one-tuple

Мы можем выполнить множество действий по очистке, чтобы никогда не столкнуться с ошибкой ключа, используя get(). Пока мы этим занимаемся, давайте также один раз запросим API страны/города, получим все данные и кэшируем их, чтобы повторные запросы выполнялись быстрее.

Этот метод часто называют замыканием.

import requests

## -------------------------------
## Use a closure to fetch and cache coutry/city data
## -------------------------------
def build_country_searcher():
    checkcities =  'https://countriesnow.space/api/v0.1/countries'
    response = requests.get(checkcities)

    if not response.ok:
        raise Exception("failed to fetch data")

    ## -------------------------------
    ## Construct lookups for counties and cities once and cache results
    ## -------------------------------
    countries = set()
    city_to_country = {}
    for country in response.json().get("data", []):
        country_name = country["country"]

        countries.add(country_name)

        for city in country["cities"]:
            city_to_country.setdefault(city, []).append(country_name)
    ## -------------------------------

    ## -------------------------------
    ## hidden utility function to just look up if the given name
    ## is a country. Note, we could also have used the abo
    ## -------------------------------
    def check_country(name):
        return name if name in countries else None
    ## -------------------------------

    ## -------------------------------
    ## Note that a city could be found in many countries so for
    ## fun, let's return those counties as a comma separated list.
    ## -------------------------------
    def check_city(name):
        return ", ".join(city_to_country.get(name, []))
    ## -------------------------------

    ## -------------------------------
    ## return our function that will process the lookups.
    ## -------------------------------
    return lambda name: check_country(name) or check_city(name) or None
    ## -------------------------------
## -------------------------------

## -------------------------------
## Build out search function
## -------------------------------
country_searcher = build_country_searcher()
## -------------------------------

print(country_searcher("Germany"))
print(country_searcher("Berlin"))
print(country_searcher("Middle Earth"))

Это должно вернуть вам:

Germany
Germany, United States
None

Другие вопросы по теме