Как сообщить средству проверки типов тип вывода внешней функции

Я пытаюсь добавить подсказки типов в пакет, который поддерживаю, для более эффективных проверок. Однако мы используем некоторые внешние пакеты, такие как numpy, scipy и т. д., которые не везде имеют подсказки типов. Таким образом, довольно часто случается, что проверяющие типы не знают, какого типа переменная, сгенерированная этими другими пакетами, но я знаю. Есть ли способ сообщить средствам проверки типов, не меняя внешние пакеты.

Я пытаюсь ввести проверочный код следующим образом:

import numpy as np
from scipy.sparse import csr_matrix, spmatrix

def run() -> spmatrix:
    a = csr_matrix(np.eye(3))
    b = csr_matrix(np.eye(3))
    c = a @ b
    c = c.multiply(3.0)
    return c

В этом коде средства проверки Pyright и аналогичных типов жалуются на строку c.multiply, а иногда и на возврат, потому что они не понимают, что c по-прежнему будет разреженной матрицей, и поэтому полагают, что она может не иметь функции .multiply или несоответствия. тип возвращаемого значения.

Я ищу какой-нибудь волшебный комментарий, который я мог бы добавить, чтобы сообщить этим проверяющим, что c будет разреженной матрицей. Типа c:spmatrix=a@b или c=a@b#pyright c:spmatrix или что бы это ни было.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Правильный способ сделать это — использовать файлы-заглушки, pyright информирующие о типах объектов в библиотеках. Эти существуют для pandas и numpy. Однако мне ничего не известно о scipy. Одна вещь, которую вы часто можете сделать (которая, кажется, работает в данном случае), — это использовать операторы assert(), чтобы помочь проверке статического типа:

def run() -> spmatrix:
    a = csr_matrix(np.eye(3))
    b = csr_matrix(np.eye(3))
    c = a @ b
    assert isinstance(c, csr_matrix) # this is new
    c = c.multiply(3.0)
    return c

Без этой строки это мой вывод pyright:

$ pyright test.py
~/test.py
  ~/test.py:9:11 - error: Cannot access attribute "multiply" for class "ndarray[Any, dtype[Unknown]]"
    Attribute "multiply" is unknown (reportAttributeAccessIssue)
  ~/test.py:9:11 - error: Cannot access attribute "multiply" for class "ndarray[Any, Unknown]"
    Attribute "multiply" is unknown (reportAttributeAccessIssue)
  ~/test.py:9:11 - error: Cannot access attribute "multiply" for class "matrix[Unknown, Unknown]"
    Attribute "multiply" is unknown (reportAttributeAccessIssue)
3 errors, 0 warnings, 0 informations 

Однако в заявлении assert() говорится:

$ pyright test.py
0 errors, 0 warnings, 0 informations 

Спасибо! это, безусловно, полезный и действенный способ сделать это. Если бы существовал способ, который наверняка ничего не запускает, я бы предпочел это. Поэтому я оставлю это открытым на мгновение, на случай, если кто-нибудь знает, как это сделать.

Xenon 19.07.2024 15:15

@Xenon согласился, что лучше не выполнять какой-либо дополнительный код. Я пытался создать заглушку, но не смог заставить ее работать. Единственным другим способом устранить предупреждение было c = typing.cast(csr_matrix, a @ b), что, на мой взгляд, было еще хуже.

SamR 19.07.2024 16:10

Другие вопросы по теме

Похожие вопросы

Разделить фрейм данных pandas на основе заданной строки строки
Как объединить подсказку типа с использованием переменной связанного типа и статических типов для максимальной гибкости?
Сравните строки из очень большого текстового файла (более 100 ГБ) с небольшим текстовым файлом (около 30 строк) и распечатайте все строки, содержащиеся в обоих файлах
Переместить часть строки в фрейме данных в новую строку
Как немедленно отменить задачу Asyncio, которая использует библиотеку Ollama Python для генерации ответа?
Как включить Intellisense при использовании YouTube API с Python в VSCode
Есть ли способ читать последовательно красиво напечатанные объекты JSON в Python?
Индексирование словаря с помощью Numpy/Jax
Python numpy, математика: каким-либо образом возвести отрицательное число в десятичную степень, не получив при этом Нэн?
Как преобразовать кортеж, содержащий [строку], в элемент словаря