В контексте простой процедурной программы, которая линейно переходит от одной строки к другой со ссылками на функции, определенные в начале, я собрал несортированный список (длиной 140) ежегодных праздников. Каждый день состоит из краткого словаря. Теперь я хочу исключить дубликаты и совпадения в несколько шагов. Интерпретатор Python озадачил меня, обнаружив значение NoneType именно там, где, как я думал, я его исключил.
Первый шаг в моей функции def сортирует список в хронологическом порядке.
Код: Выделить всё
def synthesize(days):
# Put days in chronological order.
days.sort(key = lambda x: x["date"])
Код: Выделить всё
for i, d in enumerate(days):
if ...:
days[i] = None
days = [d for d in days if d is not None]
При перечислении списка дней в третий раз я получаю:
Traceback (самый последний вызов — последний):
File "D:\Paul\Dropbox\Work\ProgrammingProjects\LiturgCal\main.py", строка 434, в
synthesize(Special_days)
файл "D:\Paul\Dropbox\Work\ProgrammingProjects\LiturgCal\main.py", строка 239, в синтезе
if d["date"] == days[j]["date"] и d["date"].weekday() == 6:
TypeError: объект 'NoneType' не подлежит подписке
Если я проверю, распечатав список дней сразу после второго условия (которое заканчивается на моей строке 226):
Код: Выделить всё
for i, d in enumerate(days):
print(f'i: {i}, d: {d}')
i: 0, d: {'date': datetime.date(2024, 12, 1), 'name': 'Advent-1', 'p': 4}
i: 1, d: {'date': datetime.date(2024, 12, 6), 'name': 'Николай', 'p': 1}
...
i: 23, d: {'date': datetime.date(2025, 2, 2), 'name': 'Pres. Lord', 'p': 5}
i: 24, d: {'date': datetime.date(2025, 2, 2), 'name': 'Ord-4/Epiph>4', 'p': 4}
i: 25, d: {'date': datetime.date(2025, 2, 9), 'name': 'Ord-5/Epiph>5', 'p': 4}
...
i: 129, d: {'date': datetime.date(2025, 11, 27), 'name': 'День благодарения', 'p': 2}
i: 130, d: {'date': datetime.date(2025, 11, 30), 'name': 'Andrew', 'p': 2}
Но если я переместим оператор печати прямо внутрь третьего условия (начиная со строки 229), я получу только первые двадцать четыре дня, заканчивающиеся значением None в i=24, которое выдает ошибку.
i: 0, d: {'date': datetime.date(2024, 12, 1), 'name': 'Advent-1', 'p': 4}
i: 1, d: {'date': datetime.date(2024, 12, 6), 'name': 'Николай', 'p': 1}
...
i: 23, d: {'date': datetime.date(2025, 2, 2), 'name': 'Pres. Lord', 'p': 5}
i: 24, d: Нет
Если я напечатаю len(days) внутри нового цикла, он напечатает 131 двадцать пять раз. Аналогично, если я напечатаю id(days) после строки 226 и снова в строке 231 (внутри цикла), он останется идентичным.
Между строкой 226:
Код: Выделить всё
days = [d for d in days if d is not None]
Код: Выделить всё
for i, d in enumerate(days):
Как список дней может содержать нежелательный None, если мой код явно исключил все None? Есть ли какая-то скрытая особенность самого Python?
Я пробовал перезапустить VSCode, перезагрузить компьютер и запустить код на другом компьютере — все вызывало одно и то же загадочное поведение.
Подробнее здесь: https://stackoverflow.com/questions/798 ... ected-type
Мобильная версия