Python проверяет тип элементов списка - PullRequest
0 голосов
/ 08 декабря 2018

Я пытаюсь использовать 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 голосов
/ 08 декабря 2018

Я предполагаю, что вы хотите проверить, что каждый объект в list_param имеет тип SpamInterface.Если это так, есть 2 разных способа проверки.Во-первых, ленивый способ использования функции 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.

...