Кажется, что проблема не в том, что экземпляры модулей не могут быть выбраны, поскольку ваш случай показывает иначе, а десериализованный экземпляр не сравнивается равным исходному экземпляру, следовательно, они рассматриваются как несовместимые модули, даже если они equivlent.
Я никогда раньше не использовал unit, но после просмотра его источника кажется, что проблема в том, что units.compatibility.compatible
проверяет, совпадают ли оба экземпляра, но LeafUnit и его базы не определяют метод __eq__
, следовательно, вместо этого проверяется идентичность объекта (для каждого питона семантика).
То есть два экземпляра блока будут сравниваться равными, только если они являются одним и тем же экземпляром (с тем же адресом памяти и т. Д.), А не двумя эквивалентными. Как правило, после отмены выбора сериализованного экземпляра он не будет таким же, как исходный (эквивалентно, да, но не таким же)
Решением может быть использование monkey-patch unit.abstract.AbstractUnit для использования метода __eq__
:
AbstractUnit.__eq__ = lambda self, other: repr(self)==repr(other)
Обратите внимание, что сравнение представлений экземпляров является неоптимальным, но лучшее, что я могу придумать, - это не знать единицу. Лучше попросить автора (-ов) сделать юнит более «сопоставимым дружественным».