Python检查列表元素的类型

时间:2018-12-08 15:15:23

标签: python abc

我正在尝试使用ABC和... 检查单个参数的类型相当简单:

def spam_method(param):
  if not isinstance(param, SpamInterface):
    raise TypeError

看起来不错。在方法定义的第一行中提到了我需要什么类型。但是传递列表呢?我是这样做的:

def many_spams(list_param):
  if list_param and not isinstance(list_param[0], SpamInterface):
    raise TypeError

但是我对此并不完全满意。还有更优雅的方式吗?你会怎么做?

1 个答案:

答案 0 :(得分:0)

我假设您要检查list_param中的每个对象都是SpamInterface 类型。在这种情况下,有两种不同的检查方法。首先,我们使用all()函数的懒惰方式:

def many_spams(list_param):
    if not all(isinstance(p, SpamInterface) for p in list_param):
        raise TypeError('Not all objects are of type SpamInterface')

此方法很简短,但它不会告诉您列表中的哪个元素未通过测试。第二种方法提供了更多细节:

def many_spams(list_param):
    for index, param in enumerate(list_param):
        if not isinstance(param, SpamInterface):
            raise TypeError('Parameter at index {} is not of type SpamInterface: {}'.format(index, param))

此方法将在第一个非SpamInterface类型的元素上引发异常。