Я работаю над созданием крупномасштабного 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» завершается неудачно.
Кто-нибудь понимает, что здесь происходит?