3 回答
TA贡献1810条经验 获得超4个赞
好像你想要
if not (isinstance(radius, int) or isinstance(radius,float)):
或者实际上
if not isinstance(radius, (float, int)):
目前你的逻辑是这样的
if isinstance(radius, int) or (isinstance(radius,float) == False):
所以,如果你有一个 int,那么你就会得到错误。如果你得到一个浮动,你就不会出错,因为你最终得到False or (True == False)
任何事物or False
都等同bool(Anything)
于 ,在本例中,True == False
,即False
此外,我建议首先提出所有错误并检查条件。
然后只返回实际的数学,因为那时变量不可能是正的
TA贡献1780条经验 获得超1个赞
您可以将多种类型传递给isinstance,这样您就可以摆脱or:
def cone(radius, height):
if not isinstance(radius, (float, int)):
raise TypeError("Error: parameters radius and height must be numeric.")
if not isinstance(height, (float, int)):
raise TypeError("Error: parameters radius and height must be numeric.")
if radius > 0 and height > 0:
return ((radius*radius)*(3.1415)*(height/3))
if radius<=0:
raise ValueError("Error: radius must be positive.")
if height <=0:
raise ValueError("Error: height must be positive.")
for value in [(1, 2), (0.33, 'foo')]:
print(cone(*value))
输出:
0.0
Traceback (most recent call last):
File "/private/tmp/s.py", line 15, in <module>
print(cone(*value))
File "/private/tmp/s.py", line 5, in cone
raise TypeError("Error: parameters radius and height must be numeric.")
TypeError: Error: parameters radius and height must be numeric.
TA贡献1866条经验 获得超5个赞
您的问题是if被评估为:
if (isinstance(radius, int)) or (isinstance(radius,float) == False)
我想这不是你的意思。
无论如何,您实际上可以通过使用try/except. 您可以假设您的参数是数字并与 进行比较0。如果不是,将引发异常以便您可以捕获它:
def cone(radius, height):
try:
if radius > 0 and height > 0:
return ((radius*radius)*(3.1415)*(height/3))
else:
raise ValueError("Error: radius and height must be positive.")
except TypeError:
raise TypeError("Error: parameters radius and height must be numeric.")
添加回答
举报