选中整数变量时,Python会忽略字典值

时间:2014-01-09 07:33:33

标签: python if-statement dictionary

请帮我解决这个简单的问题

x=1
if x["status"] == "Error":
     print "Fine"
elif x == 1:
     print "Good

    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: 'int' object has no attribute '__getitem__'

x是函数的返回值,可以是整数或字典。我不希望我的IF条件提醒我,反之亦然。

4 个答案:

答案 0 :(得分:5)

一个明显的解决方案是稍微修改您当前的代码来处理错误:

try:
    if x["status"] == "Error":
        print "Fine"
except TypeError:
    if x == 1:
        print "Good"

另一种选择是明确检查xint还是dict

if isinstance(x, dict) and x["status"] == "Error":
    print "Fine"
elif isinstance(x, int) and x == 1:
    print "Good"

虽然这消除了Python鸭子打字的一些好处;对于第一个版本,如果提供x的函数返回floatx = 1.0),它仍然有效。

答案 1 :(得分:0)

您可以使用isinstance检查x是否为字典。

if isinstance(x, dict) and x["status"] == "Error":
     print "Fine"
elif x == 1:
     print "Good

但是,更优选的是,我宁愿更改函数以返回一种类型。

答案 2 :(得分:0)

使用type(x)== int来检查它是否为int

使用type(x)== dict来检查它是否是dict

然后采取适当行动

答案 3 :(得分:0)

使用鸭子打字最灵活:

if x == 1:
    print("Good")
elif hasattr(x, '__getitem__') and x["status"] == "Error":
    print("Fine")

以上接受任何x整数或字典。为了检查字典中项目的值,需要一个_getitem__方法,并且上面的方法检查它,不再需要。

鸭子打字有两个原因:一个是用户可以创建自己的类并期望您的代码可以使用它们。另一个是官方python类可能会改变。例如,后者发生在python 2 - &gt; 3转换中。旧代码可能使用isinstance(x,unicode)将在python3下失败,而使用duck-typing的代码可能会存活。