Я пытаюсь написать функцию, которая проверяет, является ли данная переменная названием страны, названием города или каким-то мусорным словом. сначала я проверяю, является ли переменная названием страны. для этого я использую 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
Да, конечно, если хочешь @JonSG
Хотя это не гарантируется от повторного использования другими типами, 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
Если вы хотите обойти ключевую ошибку с помощью
.get()
, дайте мне знать, и я могу показать вам пример.