Код: Выделить всё
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
Мобильная версия