Что делать, когда инструмент проверки кода объявляет несоответствующие типы? - PullRequest
0 голосов
/ 04 апреля 2020

Я работаю над созданием крупномасштабного Python (внутреннего) проекта. Я работал с фирмой, которая проводит обширное тестирование, и они создали интерфейс и инструменты тестирования. Перед каждым развертыванием все инструменты (например, линтеры) запускаются регулярно.

Я некоторое время записывал код, и теперь он не проходит множество тестов. Некоторые из них являются предупреждениями об устаревших функциях или синтаксисе, который скоро будет объявлен устаревшим, и они отмечают, что начали классифицировать их как предупреждения (которые впоследствии станут ошибками), начиная с 1 января 2020 года, поэтому я знаю, что они вносят динамические c изменения в сами инструменты .

Моя проблема - куча кода, который раньше не передавался. И ошибка всегда одна и та же: если у меня есть строка, которая выглядит так, я получаю ошибку, которая говорит что-то вроде «ошибка: может не использовать оператор '-» с несовместимыми типами; a и b имеют типы numpy .array and NoneType ":

x = a - b

Это можно исправить, сделав код беспорядочным с таким исправлением:

x = a.astype(float) - b.astype(float)

Это еще хуже, потому что в реальном коде Есть 3 переменные, каждая из которых выполняет сложение и вычитание с помощью 'c', представляющего собой целочисленный массив, который работает вместе с двумя numpy массивами. Но затем код переходит от:

x = a - b - c

к:

x = a.astype(float) - b.astype(float) - c.astype(float)

И это не сработает, поскольку у int нет метода astype. Теперь ошибка выглядит следующим образом:

Файл "/home/engine.py", строка 165, в Foo lower_array [t] .astype (float)) / num_values.astype (float) AttributeError: 'NoneType' У объекта нет атрибута 'astype'

Таким образом, я получаю:

x = a.astype(float) - b.astype(float) - float(c)

Это все чрезвычайно громоздкое и неприятное приведение, которое требуется, и делает код невозможным для чтения.

Странно для меня то, что все три массива были созданы как numpy массивы, то есть:

a=numpy.array(_a)
b=numpy.array(_b)
c=numpy.array(_c)

Когда я прошу код поместить вывод в stdout, тип всех они говорят, что все три. Тем не менее, следующая строка кода взрывается и сбрасывает, говоря: «Ошибка атрибута: у объекта« NoneType »нет атрибута« astype »»

Я не могу понять, как анализатор кода stati c определяет типы - кроме как numpy .ndarray type - так как Python использует типизацию утки. Таким образом, тип может динамически меняться. Но это не тот случай здесь; все три переменные определены как numpy .ndarray тип, но «z = a - b - c» завершается неудачно.

Кто-нибудь понимает, что здесь происходит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...