Python 为什么我在尝试与字典值进行比较时出错?

Python 为什么我在尝试与字典值进行比较时出错?,python,dictionary,Python,Dictionary,我应该: 编写一个函数precision(d,a,b),该函数接受以下参数: d:将一个季节映射到该季节的降水量的字典。 a:一季 b:又是一季 如果季节a的降雨量大于季节b,则函数应返回True,否则返回False。如果降雨量相等,则返回False 您的函数应通过以下方式处理以下错误: 如果a或b在字典中不是有效的季节,则应返回一条格式完全如下的错误消息(作为字符串): “错误:键不在字典中。” 如果每个季节的降雨量值不能进行比较,即其中一个不是数字,则返回一条格式完全如下的错误消息(作为字符

我应该:

编写一个函数precision(d,a,b),该函数接受以下参数:

d:将一个季节映射到该季节的降水量的字典。 a:一季 b:又是一季

如果季节a的降雨量大于季节b,则函数应返回True,否则返回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?'
我犯了一个错误
类型为“type”的参数不可编辑
如何修复此问题以及问题的原因这是您的问题:

if d[a] not in (int) 
int
不是一个容器,它是一种类型,因此
d[a]
不能在其中*

你想确定它是整数吗?然后尝试
isinstance()


*您可以编写一个元类,该元类有一个
\uuuu contains()
方法,该方法允许您将类型视为容器,并以这种方式检查实例类型,这实际上是一种有趣的想法,但
int
不能做到这一点。

要检查参数是否为特定类型,在中使用
isinstance
-
检查iterable中是否存在特定值

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

使用此选项,因为这正是错误处理的方法

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?")

除了已经提供的正确答案外,
由于您正在使用
try
except
,因此还可以为每个块指定异常类型:

def沉淀(d、a、b): 尝试: 返回d[a]>d[b] 除KeyError外: return“错误:键不在字典中。” 除类型错误外: return“错误:字典中的数据类型无效?”
使用好的变量名。捕获确切的异常类型。问题语句未指定数据类型必须为int。您需要在比较这些类型之前检查它们。如果else在您返回它正在检查的表达式时是多余的。您的意思是除了ValueError之外的
吗?如果出现值错误,例如我们将字符串与整数进行比较,那么这是一个值错误,因此我们的程序将跳转到ValueError块。
如果始终采用ValueError
,则
ValueError
是真实的。
if if d[a] not in (int) or d[b] not in (int):
    return ("Error: Invalid data types in Dictionary?")