Почему средство проверки типов PyCharm выдает предупреждение об операторах в классе ComponentData, когда они индексируютPython

Программы на Python
Ответить
Anonymous
 Почему средство проверки типов PyCharm выдает предупреждение об операторах в классе ComponentData, когда они индексируют

Сообщение Anonymous »

Я работаю над моделью Pyomo с индексированными переменными, выражениями и ограничениями и получаю несколько предупреждений относительно класса ComponentData. Модель по-прежнему работает гладко, и результаты верны, но предупреждения теперь накапливаются, поэтому я хотел разобраться в этом. Я заметил, что получаю предупреждения только тогда, когда работаю с индексированными значениями. Без индексированных значений они не отображаются.
Вот минимальный пример с индексированными значениями:

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

import pyomo.environ as pyo

model = pyo.ConcreteModel()
model.s = pyo.Set(initialize=[1, 2, 3])  # with indexes = with warnings
model.v1 = pyo.Var(model.s, bounds=(0.1, 1.0))
model.v2 = pyo.Var(model.s, bounds=(0.2, 1.0))

def x_rule(m: pyo.Model, s: int):
return m.v1[s] * m.v2[s]
model.x = pyo.Expression(model.s, rule=x_rule)

def objective(m: pyo.Model):
return sum(m.x[s] for s in m.s)
model.obj = pyo.Objective(rule=objective)

pyo.SolverFactory("ipopt").solve(model)
В этом примере PyCharm (версия 2025.3) выдает следующие предупреждения:
  • В правиле x_rule (специально для оператора умножения *):

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

    Class 'ComponentData' does not define '__mul__', so the '*' operator cannot be used on its instances
  • В целевой функции (особенно для кода внутри функции суммы):

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

    Unexpected type(s): Generator[ComponentData, Any, None]) Possible type(s): [...]
Вот минимальный пример без индексированных значений:

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

import pyomo.environ as pyo

model = pyo.ConcreteModel()
model.v1 = pyo.Var(bounds=(0.1, 1.0))
model.v2 = pyo.Var(bounds=(0.2, 1.0))

def x_rule(m: pyo.Model):
return m.v1 * m.v2
model.x = pyo.Expression(rule=x_rule)

def objective(m: pyo.Model):
return m.x
model.obj = pyo.Objective(rule=objective)

pyo.SolverFactory("ipopt").solve(model)
Это очень похожий пример, только без индексов, и я не получаю здесь никаких предупреждений.
В обоих случаях я получаю одинаковые результаты (только один раз для всех трех значений v1 и v2 и один раз для одной переменной). Мой собственный проект со значительно большим количеством переменных (и, к сожалению, с большим количеством предупреждений...) также выполняется и дает значимые результаты.
Использую ли я индексированные значения в функциях неправильно или нечисто, из-за чего я получаю эти предупреждения, или это из-за «ложноположительных» предупреждений, которые иногда выдает Pyomo? В аналогичном случае (почему PyCharm выдает мне предупреждение при использовании метода .fix() Pyomo?) я также получал предупреждения от Pyomo о функциях, которые описаны в их документации по мере их использования и, вероятно, еще не устранены.

Подробнее здесь: https://stackoverflow.com/questions/798 ... e-componen
Ответить

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

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

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

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

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