Несмотря на исключение значений None из списка Python, я все равно получаю неожиданное сообщение «TypeError: объект «NonPython

Программы на Python
Ответить
Anonymous
 Несмотря на исключение значений None из списка Python, я все равно получаю неожиданное сообщение «TypeError: объект «Non

Сообщение Anonymous »

Python 3.12.6 в Windows 11

В контексте простой процедурной программы, которая линейно переходит от одной строки к другой со ссылками на функции, определенные в начале, я собрал несортированный список (длиной 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]
Первые два условия уменьшают len(days) со 140 до 133, а затем до 131.

При перечислении списка дней в третий раз я получаю:

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}')
Я получаю полный список из 131 дня:

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]
и строка 229:

Код: Выделить всё

for i, d in enumerate(days):
У меня нет кода, только пустое строковое пространство и #comment.

Как список дней может содержать нежелательный None, если мой код явно исключил все None? Есть ли какая-то скрытая особенность самого Python?

Я пробовал перезапустить VSCode, перезагрузить компьютер и запустить код на другом компьютере — все вызывало одно и то же загадочное поведение.

Подробнее здесь: https://stackoverflow.com/questions/798 ... ected-type
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»