请帮我解决这个简单的问题
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
条件提醒我,反之亦然。
答案 0 :(得分:5)
一个明显的解决方案是稍微修改您当前的代码来处理错误:
try:
if x["status"] == "Error":
print "Fine"
except TypeError:
if x == 1:
print "Good"
另一种选择是明确检查x
是int
还是dict
:
if isinstance(x, dict) and x["status"] == "Error":
print "Fine"
elif isinstance(x, int) and x == 1:
print "Good"
虽然这消除了Python鸭子打字的一些好处;对于第一个版本,如果提供x
的函数返回float
(x = 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的代码可能会存活。