В настоящее время я улучшаю покрытие ввода в моем приложении Django и столкнулся с проблемой:
У меня есть модель A
, которая выглядит следующим образом:
class A(models.Model):
account = models.ForeignKey(Account, on_delete=models.CASCADE)
limit_amount = models.BigIntegerField(null=True)
In время жизни A
экземпляров, с точки зрения бизнеса, я знаю, что у некоторых A
экземпляров всегда будет заполнено поле limit_amount
.
Итак, в коде я буду использовать некоторые функции такие как:
def get_floored_limit_amount(a: A) -> int:
return math.floor(a.limit_amount)
Но mypy
- по праву - заявит, что limit_amount может быть None
и выдаст ошибку.
Тем не менее, я не хочу добавлять проверки на каждое поле, которое будет иметь одинаковое поведение в каждой функции, которая будет предполагать, что экземпляр находится в данном конкретном бизнес-состоянии.
Поэтому моей первой идеей было создать подсказку другого типа, например, в псевдо-python:
type AVariant(A):
limit_amount: int
и используйте его в указанных функциях. Видите ли вы способ сделать это?
Последнее, что у меня было, - это добавить в класс A
метод, который будет проверять правильность каждого поля или выдавать ошибки; и вызывать этот метод в начале каждой функции. Но я не знаю, если это самый чистый способ сделать это.
РЕДАКТИРОВАТЬ: Эта последняя идея не работает с mypy.