Использование списков и исключений?

Хорошо, скажем, у меня есть список, и я хочу проверить, существует ли этот список в другом списке. Я могу это сделать:

all(value in some_map for value in required_values) 

Это работает отлично, но позволяет сказать, что я хочу, чтобы исключение было вызвано, когда требуемое значение отсутствует, со значением, которое оно отсутствует. Как я могу это сделать, используя понимание списка?

Мне более или менее любопытно, все признаки, похоже, указывают на нет.

EDIT Argh Я имел в виду это:

 for value in required_values: if value not in some_map: raise somecustomException(value) 

Глядя на тех, кого я не вижу, как я могу найти значение, где произошла ошибка

скажем, я хочу повысить исключение, когда требуемое значение отсутствует, со значением, которое оно отсутствует. Как я могу это сделать, используя понимание списка?

Сопоставление списков – это синтаксически сжатый способ создания списка на основе какого-либо существующего списка – они не являются универсальным способом написания любого for -loop в одной строке. В этом примере вы фактически не создаете список, поэтому не имеет смысла использовать понимание списка.

Вы не можете использовать рейз в понимании списка. Вы можете проверить себя, посмотрев грамматику в справочнике по языку Python .

Однако вы можете вызвать функцию, которая вызывает для вас исключение.

Если вы не хотите рассматривать дубликаты и значения хешируются, используйте наборы. Они легче, быстрее и могут извлекать «все» элементы, отсутствующие за одну операцию:

 required_values = set('abc') # store this as a set from the beginning values = set('ab') missing = required_values - values if missing: raise SomeException('The values %r are not in %r' % (missing, required_values)) 

Другой (уродливой) возможностью будет функция error_on_false :

 def error_on_false(value) if value: return value else: raise Exception('Wrong value: %r' % value) if all(error_on_false(value in some_map) for value in required_values): continue_code() do_something('...') 

Это уродливо. Вместо этого я бы использовал set .

Мне было интересно сегодня вечером. Мой вариант использования – итерирование по списку объектов и повышение ошибки, когда объект не был определенного типа. Мое решение – использовать генератор.

 def iter_my_class(my_class_list): for c in my_class_list: if not isinstance(c, MyClass): raise ValueError('Expected MyClass') yield c 

Затем используется как

 classes = [c for c in iter_my_class(my_class_list)] 

Я написал это на своем телефоне. Если это бежит без ошибок, вы все должны мне пива.

Хотя я думаю, что использование наборов (например, пример nosklo) лучше, вы можете сделать что-то простое:

 def has_required(some_map, value): if not value in some_map: raise RequiredException('Missing required value: %s' % value) all(has_required(some_map, value) for value in required_values)