有人可以告诉我为什么以下失败:
teststr = "foo"
if not teststr.isdigit() and int(teststr) != 1:
pass
使用:
ValueError: invalid literal for int() with base 10: 'foo'
在C中,如果&&
测试中的第一部分失败,则不再评估右侧。这在Python中是不同的吗?
and
当然应该是or
.....
答案 0 :(得分:8)
not teststr.isdigit()
为True,因此第一次测试不会失败。
答案 1 :(得分:2)
if not teststr.isdigit() and int(teststr) != 1:
评估为
if ((not teststr.isdigit()) and (int(teststr) != 1)):
好吧,但teststr
不是数字,因此isdigit()
为false,因此(not isdigit())
为真。对于True and B
,你必须评估B.这就是为什么它会将演员阵容设为int。
答案 2 :(得分:0)
if not teststr.isdigit()
为True,因此需要评估int(teststr)
以完成and
的要求 - 因此例外。
不使用预先检查数据,而是使用EAFP - 并使用以下内容......
try:
val = int(teststr)
if val != 1:
raise ValueError("wasn't equal to 1")
except (ValueError, TypeError) as e:
pass # wasn't the right format, or not equal to one - so handle
# carry on here...
答案 3 :(得分:0)
您可能想要使用的代码可能是
try:
int(teststr)
except ValueError:
print "Not numeric!"
尝试某些事情并捕获异常通常更加pythonic,而不是像你一样使用类型检查方法。