Проверьте NoneTypes в списке итераций - PullRequest
1 голос
/ 19 июня 2020

Я хотел бы l oop над списком итераций, но с требованием, чтобы некоторые элементы могли иметь тип None.

Это может выглядеть примерно так:

none_list = [None, [0, 1]]

for x, y in none_list:
    print("I'm not gonna print anything!")

Однако это вызовет TypeError: 'NoneType' object is not iterable.

В настоящее время я обнаруживаю ошибку и обрабатываю NoneType впоследствии. Для моего варианта использования это приводит к большому количеству дублированного кода, поскольку я в основном заменяю значения None и делаю то же, что изначально планировалось внутри for-l oop.

try:
    for x, y in none_list:
        print("I'm not gonna print anything!")
except TypeError:
    print("But I will!")
    # Deal with NoneType here

Вопрос: Как лучше всего игнорировать TypeError и проверять значения None внутри начального l oop?

Ответы [ 2 ]

5 голосов
/ 19 июня 2020

Вы можете перебирать каждый элемент и проверять наличие None:

none_list = [None, [0, 1]]
for item in none_list:
    if item is None:
        continue
    x, y = item
    print(x, y)

Или вы можете использовать понимание списка, чтобы сначала исключить None s, а затем вы можете выполнить итерацию в обычном режиме:

list_without_none = [item for item in none_list if item is not None]
for x, y in list_without_none:
    print(x, y)
3 голосов
/ 19 июня 2020

Я нахожу filter очень удобным для этого:

for x,y in filter(None, none_list):
    do_stuff()
...