Как разрешить «Несовместимые типы в назначении» при преобразовании значений словаря из str в datetime в Python?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как разрешить «Несовместимые типы в назначении» при преобразовании значений словаря из str в datetime в Python?

Сообщение Anonymous »

Я работаю с словарем в Python, где ключ (

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

"expiryTime"
) изначально содержит значение str в формате ISO 8601 (например, «2025-01-23T12:34:56»). В какой-то момент моего кода я преобразую эту строку в объект datetime, используя datetime.strptime. Однако во время проверки типа я столкнулся с ошибкой mypy:

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

error: Incompatible types in assignment (expression has type "datetime", target has type "str")  [assignment]
< /code>
Вот упрощенная версия кода: < /p>
from datetime import datetime

# Initial dictionary with string value
token_dict: dict[str, str] = {"expiryTime": "2025-01-23T12:34:56"}

# Convert the string to datetime
expiry_time_dt = datetime.strptime(token_dict["expiryTime"], "%Y-%m-%dT%H:%M:%S")
token_dict["expiryTime"] = expiry_time_dt  # Error here: incompatible types
Я понимаю, что mypy жалуется, потому что значение словаря изначально было объявлено как str, а назначение объекта datetime нарушает объявленный тип. Однако мне нужно сохранить объект datetime для дальнейшей обработки в моем коде.

Мой вопрос:
Как лучше всего справиться с этой ситуацией, сохранив при этом безопасность типов с помощью mypy? Должен ли я:
  • Подавить ошибку проверки типов с помощью # type: ignore?
  • Провести рефакторинг моего код для использования типа Union[str, datetime] для значений словаря, несмотря на ошибку strptime?
  • Используйте альтернативный подход, о котором я, возможно, не знаю ?
Цель — обеспечить, чтобы код остается типобезопасным при обработке необходимых преобразований между str и datetime. Будем признательны за любые советы и рекомендации по улучшению этого рабочего процесса!
Что я пробовал:

[*]< strong>Подавлена ​​ошибка:
Я использовал # type: ignore, чтобы временно обойти проблему:

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

token_dict["expiryTime"] = expiry_time_dt  # type: ignore
Хотя это работает, это не чистое и не типизированное решение.

[*] Использование Union[str, datetime]:
Я обновил подсказку типа словаря:

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

token_dict: dict[str, Union[str, datetime]] = {"expiryTime": "2025-01-23T12:34:56"}
Это было единственное жизнеспособное решение, пока я не столкнулся с следующей mypy ошибкой:

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

error: Argument 1 to "strptime" of "datetime" has incompatible type "Union[str, datetime]"; expected "str"  [arg-type]
Ошибка возникает, когда я пытаюсь передать Union [str, dateTime] значение strptime , который ожидает str . Это создает дополнительную сложность, потому что Mypy требует явных проверок типа для каждого доступа к token_dict ["expirytime"] , что затрудняет поддержание правильности типа.
преобразование в str < /code> для насмешки: < /strong>
При издевании запросов, которые взаимодействуют с этим словарем, я должен убедиться, что значение сериализуется обратно на строку (Поскольку DateTime не является json-serializable). Это обратное преобразование неизбежно, и мне нужно обеспечить правильность типа в моем коде. < /P>
< /li>
< /ol>
< Br /> Контекст проблемы (для справки): < /h3>
Ключ "exrytime" < /code> является частью словаря токенов, который представляет метаданные для аутентификации. При насмешливых запросах я сериализую словарь, используя JSON, который не поддерживает объекты DateTime . Это требует преобразования значений DateTime обратно в строки перед сериализацией. Конверсии на заднем плане в сочетании с аннотациями типа сделали эту проблему сложной задачей.

Подробнее здесь: https://stackoverflow.com/questions/793 ... ionary-val
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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