if 语句执行 Else 即使 If 似乎是真的?



我正在尝试制作一些捕获错误的代码。它将始终执行第一个if语句的else块,无论函数的输入是什么。为什么要这样做?

这是捕获错误的代码:

def rgbtohex(r=0, g=0, b=0):
'''Converts RGB values to hecadeximal values. Supports 3 integers, one list, or one tuple.'''
if type(r) == 'int' and type(g) == 'int' and type(b) == 'int':
if r > 255 or g > 255 or b > 255:
raise ValueError('one or more arguments are above 255.')
elif type(r) == 'list' or type(r) == 'tuple':
if r[0] > 255 or r[1] > 255 or r[2] > 255:
raise ValueError('one or more index values are above 255.')
if g == 0 and b == 0:
r = r[0]
g = r[1]
b = r[2]
else:
raise TypeError('rgb values not integers, single list, or single tuple.')
return
else:
raise TypeError('one or more arguments are not integers.')
...

在 Python 中,整数类型是int,而不是字符串"int"

删除引号。

tuplelist也是如此。

这是一个很容易犯的错误,因为其他语言如JavaScript和Lua使用字符串来指示类型。但是在Python中(如在Ruby中),类型是实际的对象,并由标识符引用。

肥皂盒

需要考虑的事情:我看到您正在尝试创建一个用户可以传递三个整数、一个元组或列表的函数。您试图在这里让您的呼叫者具有一定的灵活性,这是值得称赞的,但是您最终得到

的是
  1. 对参数进行类型检查,这不是超级 Pythonic,并且
  2. 对列表或元组使用名为r的参数!

第二部分意味着有人可以打电话

rgbtohex(r=[21,128,123])

这有点奇怪。

我要做的是仅将您的函数定义为

def rgbtohex(r = 0, g = 0, b = 0):
...

如果您的用户有一个列表或元组,他们将知道像这样解压缩和调用:

my_color = [21,128,123]
rgbtohex(*myColor)

以下是我的做法:

def rgbtohex(r=0, g=0, b=0):
if not all(c in range(256) for c in (r, g, b)):
raise ValueError('Components must be in range 0...255')
return '#{:02x}{:02x}{:02x}'.format(r, g, b)
assert(rgbtohex() == '#000000')
assert(rgbtohex(9, 20, 255) == '#0914ff')
assert(rgbtohex(9, b=20, g=192) == '#09c014')
assert(rgbtohex(*[11, 0, 0]) == '#0b0000')
// Negative tests left as an exercise for the reader ;-)

即使 If 是真的?

永远不要假设这一点。代码不会说谎。

type(r)实际上是int时,type(r) == 'int'永远不会是真的(没有引号)

试试print(type(r) == 'int')


不要将类型字符串化。

例如,isinstance(r, int)看起来确实更好

至于检查列表、集合、元组等。

在 Python 中,如何确定对象是否可迭代?

您可以使用isinstance()方法,因为将intstr进行比较将始终False

因此,您可以更改您的状况

if type(r) == 'int' and type(g) == 'int' and type(b) == 'int':
# process

自:

if isinstance(r, int) and isinstance(g, int) and isinstance(b, int):
# process

做,其他条件也一样。

type() 返回的值的类型是 'type' 类型。若要检查x是否为整数,请使用以下代码:

if type(x) == type(5):
print("X is an integer.")

相关内容

最新更新