Назначение абстрактных атрибутов через конструктор в классе данных Python `jax`Python

Программы на Python
Ответить
Anonymous
 Назначение абстрактных атрибутов через конструктор в классе данных Python `jax`

Сообщение Anonymous »

Я пытаюсь создать подкласс класса данных AbstractWrappedSolver из библиотеки jax diffrax. Класс имеет следующее определение:

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

class AbstractWrappedSolver(AbstractSolver[_SolverState]):
"""Wraps another solver "transparently", in the sense that all `isinstance` checks
will be forwarded on to the wrapped solver, e.g. when testing whether the solver is
implicit/adaptive/SDE-compatible/etc.

Inherit from this class if that is desired behaviour. (Do not inherit from this
class if that is not desired behaviour.)

Subclasses must define `.solver` as a dataclass field or as a property.
"""

solver: AbstractVar[AbstractSolver]
Мне удалось создать его экземпляр, определив решатель вне области действия класса, а затем установив его как поле класса данных:

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

import diffrax as dx

solver = dx.Tsit5()

class MySolver(dx.AbstractWrappedSolver):

solver = solver
interpolation_cls = solver.interpolation_cls
term_structure = dx.AbstractTerm

# Abstract methods from the grandparent class AbstractSolver, to fill later
def func(self):
pass

def init(self):
pass

def step(self):
pass

obj = MySolver()
Это работает без проблем.
Однако мне сложно создать его экземпляр, передав решатель конструктору. Используя очень наивные привычки Python, я написал это:

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

import diffrax as dx
from typing import Any

class MySolver(dx.AbstractWrappedSolver):

solver: Any
interpolation_cls: Any
term_structure: Any

def __init__(self, solver):
self.solver = solver
self.interpolation_cls = solver.interpolation_cls
self.term_structure = dx.AbstractTerm

# Abstract methods from the grandparent class AbstractSolver, to fill later
def func(self):
pass

def init(self):
pass

def step(self):
pass

obj = MySolver(dx.Tsit5())
Это выдает ошибку:

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

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[9], line 24
21     def step(self):
22         pass
---> 24 obj = MySolver(dx.Tsit5())

[... skipping hidden 1 frame]

File ~/my_path/.venv/lib/python3.13/site-packages/equinox/_module/_better_abstract.py:229, in BetterABCMeta.__call__(cls, *args, **kwargs)
227 if len(cls.__abstractclassvars__) > 0:  # pyright: ignore
228     abstract_class_vars = set(cls.__abstractclassvars__)  # pyright: ignore
--> 229     raise TypeError(
230         f"Can't instantiate abstract class {cls.__name__} with abstract class "
231         f"attributes {abstract_class_vars}"
232     )
233 self = super().__call__(*args, **kwargs)
234 if len(cls.__abstractvars__) > 0:  # pyright: ignore

TypeError: Can't instantiate abstract class MySolver with abstract class attributes {'interpolation_cls', 'term_structure'}
Меня смущает то, что я пытаюсь присвоить полям одни и те же величины, поэтому я не знаю, почему в одном случае они считаются абстрактными, а в другом — нет. Есть что-то очевидное, что мне не хватает.
Я чувствую, что это элементарное непонимание классов данных Python, но дайте мне знать, если это лучше подходит для людей в diffrax.
EDIT: это была ошибка в Equinox, которая будет исправлена ​​в следующем обновлении.>

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

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

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

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

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

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