Введите проверку необязательного атрибута, значение которого связано со значением другого атрибута. ⇐ Python
Введите проверку необязательного атрибута, значение которого связано со значением другого атрибута.
У меня есть функция, которая вычисляет Результат, и это вычисление может быть либо успешным, либо нет. В случае успеха также будут возвращены некоторые данные, суммирующие результат вычислений. В случае неудачи эти данные будут иметь значение None. Теперь проблема в том, что, хотя я проверяю статус вычисления (успех), средство проверки типов (mypy) не может определить связь между успехом > и данные. Это резюмируется следующим кодом:
из классов данных импортировать класс данных от ввода импорта Необязательно @dataclass результат класса: успех: бул data: Необязательный[int] # Это не None, если `success` равен True. def Compute(inputs: str) -> Результат: if inputs.startswith('!'): # К сожалению, какое-то условие препятствует вычислению. вернуть результат (успех = False, данные = нет) вернуть результат (успех = True, данные = len (входные данные)) проверка защиты (входные данные: str) -> bool: return (результат:= вычисления(входные данные)).success и result.data > 2 утвердить проверку('123') утверждать не проверять('12') утверждать не проверять('!123') Выполнение mypy для этого кода приводит к следующей ошибке:
test.py:18: ошибка: неподдерживаемые типы операндов для < («int» и «None») [оператор] test.py:18: примечание: левый операнд имеет тип «Необязательный[int]». Я рассмотрел следующие решения, но ни одно из них мне не очень понравилось. Итак, мне интересно, есть ли лучший способ решить эту проблему.
typing.cast
Функция check может быть изменена для использования cast(int, result.data) для обеспечения логической связи между success и >данные. Однако необходимость прибегать к cast кажется признаком того, что с кодом что-то не так (по крайней мере, в этом случае). Кроме того, мне пришлось бы использовать cast каждый раз, когда эта связь используется в коде. Лучше было бы решить это в одном месте.
Убедитесь, что result.data не имеет значения None
В приведенном выше примере связь между success и data довольно проста: success == data не равно None. Итак, я мог бы вообще удалить атрибут success и вместо этого проверить, что result.data не имеет значения None.
def check(inputs: str) -> bool: return (Result:= Compute(inputs)).data не имеет значения None и result.data > 2 Хотя это работает, реальный вариант использования более сложен и существуют различные поля данных, например, data_x, data_y и data_z . В этом случае success == all(d не имеет значения None для d в [data_x, data_y, data_z]). Использование этого параметра в качестве проверки слишком многословно, поэтому я бы реорганизовал его в свойство класса Result. Для приведенного выше примера это будет:
@dataclass результат класса: данные: Необязательный[int] @свойство защита успеха(сам) -> bool: вернуть self.data не None Однако, когда проверка нет None перемещается в свойство, mypy больше не может сделать вывод, что result.data действительно не < code>None, когда result.success имеет значение True.
У меня есть функция, которая вычисляет Результат, и это вычисление может быть либо успешным, либо нет. В случае успеха также будут возвращены некоторые данные, суммирующие результат вычислений. В случае неудачи эти данные будут иметь значение None. Теперь проблема в том, что, хотя я проверяю статус вычисления (успех), средство проверки типов (mypy) не может определить связь между успехом > и данные. Это резюмируется следующим кодом:
из классов данных импортировать класс данных от ввода импорта Необязательно @dataclass результат класса: успех: бул data: Необязательный[int] # Это не None, если `success` равен True. def Compute(inputs: str) -> Результат: if inputs.startswith('!'): # К сожалению, какое-то условие препятствует вычислению. вернуть результат (успех = False, данные = нет) вернуть результат (успех = True, данные = len (входные данные)) проверка защиты (входные данные: str) -> bool: return (результат:= вычисления(входные данные)).success и result.data > 2 утвердить проверку('123') утверждать не проверять('12') утверждать не проверять('!123') Выполнение mypy для этого кода приводит к следующей ошибке:
test.py:18: ошибка: неподдерживаемые типы операндов для < («int» и «None») [оператор] test.py:18: примечание: левый операнд имеет тип «Необязательный[int]». Я рассмотрел следующие решения, но ни одно из них мне не очень понравилось. Итак, мне интересно, есть ли лучший способ решить эту проблему.
typing.cast
Функция check может быть изменена для использования cast(int, result.data) для обеспечения логической связи между success и >данные. Однако необходимость прибегать к cast кажется признаком того, что с кодом что-то не так (по крайней мере, в этом случае). Кроме того, мне пришлось бы использовать cast каждый раз, когда эта связь используется в коде. Лучше было бы решить это в одном месте.
Убедитесь, что result.data не имеет значения None
В приведенном выше примере связь между success и data довольно проста: success == data не равно None. Итак, я мог бы вообще удалить атрибут success и вместо этого проверить, что result.data не имеет значения None.
def check(inputs: str) -> bool: return (Result:= Compute(inputs)).data не имеет значения None и result.data > 2 Хотя это работает, реальный вариант использования более сложен и существуют различные поля данных, например, data_x, data_y и data_z . В этом случае success == all(d не имеет значения None для d в [data_x, data_y, data_z]). Использование этого параметра в качестве проверки слишком многословно, поэтому я бы реорганизовал его в свойство класса Result. Для приведенного выше примера это будет:
@dataclass результат класса: данные: Необязательный[int] @свойство защита успеха(сам) -> bool: вернуть self.data не None Однако, когда проверка нет None перемещается в свойство, mypy больше не может сделать вывод, что result.data действительно не < code>None, когда result.success имеет значение True.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение