如果声明执行Else即使If似乎是真的?

时间:2017-04-09 04:06:16

标签: python if-statement

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

这是错误捕捉的代码:

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.')
    ...

4 个答案:

答案 0 :(得分:3)

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

删除引号。

同样适用于tuplelist

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

<强>肥皂盒

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

  1. 对参数进行类型检查,这不是超级Pythonic,而是
  2. 使用名为r的参数作为列表或元组!
  3. 第二部分意味着有人可以致电

    rgbtohex(R = [21128123])

    这有点奇怪。

    我要做的是将您的功能定义为

    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 ;-)
    

答案 1 :(得分:2)

  

即使If是真的吗?

从不假设这一点。代码不是谎言。

type(r) == 'int'实际上是type(r)(没有引号)

时,

int永远不会成立

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

不要将你的类型串起来。

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

检查列表,集合,元组等。

In Python, how do I determine if an object is iterable?

答案 2 :(得分:0)

您可以使用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

对其他条件也一样。

答案 3 :(得分:0)

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

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