Как решить проблему «Заявление недостижимо [недоступно]» с помощью mypy при установке значения атрибута в методе?Python

Программы на Python
Ответить
Anonymous
 Как решить проблему «Заявление недостижимо [недоступно]» с помощью mypy при установке значения атрибута в методе?

Сообщение Anonymous »

Описание проблемы
Предположим, следующий тест

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

class Foo:

def __init__(self):
self.value: int | None = None

def set_value(self, value: int | None):
self.value = value

def test_foo():

foo = Foo()
assert foo.value is None
foo.set_value(1)
assert isinstance(foo.value, int)
assert foo.value == 1 # unreachable
Тест:
  • Сначала проверяется, является ли foo.value чем-то
  • Затем устанавливается значение с помощью метода.
  • Затем проверяется, что foo.value изменилось.
При запуске теста с mypy версии 1.9.0 (последняя версия время написания) и установив для alert_unreachable значение True, получим:

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

(venv) niko@niko-ubuntu-home:~/code/myproj$ python -m mypy tests/test_foo.py
tests/test_foo.py:16: error: Statement is unreachable  [unreachable]
Found 1 error in 1 file (checked 1 source file)
Что я нашел
  • В mypy GitHub есть открытая проблема: https://github.com/python/mypy/issues/11969 В одном комментарии говорилось, что нужно использовать Safe-assert, но после переписывания теста как

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

from safe_assert import safe_assert

def test_foo():

foo = Foo()
safe_assert(foo.value is None)
foo.set_value(1)
safe_assert(isinstance(foo.value, int))
assert foo.value == 1
проблема сохраняется (safe-assert 0.4.0)[1]. На этот раз и mypy, и VS Code Pylance думают, что foo.set_value(1) двумя строками выше недостижимы.
Вопрос
Как я могу сказать mypy, что foo.value изменилось на int и что он должен продолжать проверять также все, что находится в строке Assert isinstance(foo.value, int)?

[1] ОБНОВЛЕНИЕ: в Safe_assert версии 0.5.0 проблема устранена

Подробнее здесь: https://stackoverflow.com/questions/782 ... setting-at
Ответить

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

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

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

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

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