Почему я получаю сообщение об ошибке при сравнении со словарными значениями? - PullRequest
0 голосов
/ 29 мая 2020

Я должен:

Написать функцию, осадки (d, a, b), которая принимает параметры:

d: Словарь, отображающий сезон и количество осадков для этого сезон. a: Один сезон b: Другой сезон

Ваша функция должна возвращать True, если количество осадков в сезоне a было больше, чем в сезоне b, и False в противном случае. Если количество осадков было равным, верните False.

Ваша функция должна обрабатывать следующие ошибки следующими способами:

Если a или b не являются допустимым сезоном в словаре, вы должны вернуть сообщение об ошибке (в виде строки), отформатированное точно так: «Ошибка: ключа нет в словаре».

Если значения количества осадков в каждом сезоне недопустимы для сравнения, то есть одно из них не является число, вернуть сообщение об ошибке (в виде строки) в точном формате: «Ошибка: недопустимые типы данных в словаре?»

Вы можете предположить, что ни один тестовый пример не вызовет оба типа ошибок (поэтому вы не необходимо решить, возвращать ли ошибку ключа или ошибку недопустимого типа, когда вы столкнетесь с обоими). Однако вы не должны делать никаких предположений о существующих сезонах - иногда может быть сезон «картофеля».

Я написал функцию, которая в основном верна

def precipitation(d, a, b):

    try:
        if d[a] > d[b]:
            return True
        else:
            return False

    except:
        if a not in d or b not in d:
            return ("Error: Key is not in Dictionary.")

        if d[a] not in (int) or d[b] not in (int):
            return ("Error: Invalid data types in Dictionary?")

Когда я запустите эту функцию с помощью тестового примера

precipitation({"Spring": 'cats', "Summer": 313, "Fall": 1457, "Winter": 354}, "Summer", "Spring") == 'Error: Invalid data types in Dictionary?'

Я получаю сообщение об ошибке argument of type 'type' is not iterable Как я могу это исправить и что вызывает проблему

Ответы [ 4 ]

2 голосов
/ 29 мая 2020

В дополнение к уже предоставленным правильным ответам,
, поскольку вы используете try и except, вы также можете указать тип исключения для каждого блока:

def precipitation(d, a, b):
    try:
        return d[a] > d[b]
    except KeyError:
        return "Error: Key is not in Dictionary."
    except TypeError:
        return "Error: Invalid data types in Dictionary?"
2 голосов
/ 29 мая 2020

Это ваша проблема:

if d[a] not in (int) 

int не контейнер, это тип, поэтому d[a] не может быть в нем. *

Вы пытаетесь чтобы убедиться, что это целое число? Затем попробуйте isinstance():

if not isinstance(d[a], int) ...

* Вы можете написать метакласс с методом __contains__(), который позволяет вам обрабатывать типы как контейнеры и таким образом проверять типы экземпляров, что на самом деле своего рода интересная идея, но int этого не делает.

0 голосов
/ 29 мая 2020

используйте это, поскольку это точный способ обработки ошибок

if ValueError:
    return ("Error: Invalid data types in Dictionary?")

вместо

if if d[a] not in (int) or d[b] not in (int):
    return ("Error: Invalid data types in Dictionary?")
0 голосов
/ 29 мая 2020

Чтобы проверить, является ли параметр заданным типом c, используйте команду isinstance - in проверяет, присутствует ли заданное значение c в итерируемом объекте.

if not isinstance(d[a], int) or not isinstance(d[b], int):
    return ("Error: Invalid data types in Dictionary?")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...