Есть ли способ конвертировать экземпляры классов Sympy.core.numbers в собственные классы Python?Python

Программы на Python
Ответить
Anonymous
 Есть ли способ конвертировать экземпляры классов Sympy.core.numbers в собственные классы Python?

Сообщение Anonymous »

При использовании Sympy.solve(x,x) выходные данные всегда представляют собой класс Sympy, а не собственный класс Python.
Контекст:
Я реализую в Python концепцию бесконечных множеств (например, набора целых, рациональных чисел и т. д.), двоичных операций и групповых структур. Проблема возникает при попытке определить, имеет ли групповая структура идентификационный элемент.
Для этого бесконечные множества работают с использованием условия (передаваемого как лямбда-функция), которое затем определяет если вход будет членом этого набора. Поскольку он не ведет себя как набор Python (он не имеет каких-либо строгих значений) и имеет бесконечную длину, его нельзя перебирать. Бесконечный набор не знает, что такое любой из его элементов, но способен идентифицировать значение как элемент, если оно соответствует переданному условию.
Элемент идентичности группы — Подобная структура – ​​это элемент () набора S, так что применение бинарной операции () на e и любом другом элементе () из S даст . Рассмотрим операцию + и набор целых чисел. Элемент идентичности () будет таким, что a+e = a, что интуитивно понятно, когда e=0.
Код:
В Python мы можем построить бинарную операцию следующим образом:

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

ADD = BinaryOperation(lambda a,b: a+b)
,
и набор целых чисел в виде:

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

Integers = InfiniteSet(lambda x: isinstance(x,int))
, где указанный параметр присваивается переменной self.Condition.
Класс Binary Operation использует метод __call__, который напрямую вызывает переданный ему лямбда-метод (поэтому ADD (5,3) использует лямбда-функцию с a=5 и b=3, чтобы получить 8). У него также есть свойство Expr, которое заменяет символы «a» и «b» в его функции и возвращает результат. ADD.Expr приведет к выражению симпы a+b
Класс InfiniteSet использует метод __contains__, который гласит:

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

def __contains__(self,o): return self.Condition(o)
Обратите внимание, что x.__contains__(y) идентичен y в x.
При определении наличия групповой структуры имеет элемент идентификации, можно (но не оптимизировано) перебирать набор, но это невозможно сделать для бесконечных наборов, поскольку они хранят только условие. Поэтому я использую Sympy для поиска значения «e», чтобы при применении двоичной операции получался тот же результат, что можно сделать с помощью Sympy.solve.
Структура типа Group имеет переменные Set и BinOp, представляющие объекты Infinite Set и Binary Operation соответственно, а также свойство HasIdentity, которое определяет, имеет ли группа элемент идентификации, как описано. выше (в данном случае b, чтобы быть соответствует свойству .Expr двоичной операции).

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

def HasIdentity(self): return sympy.solve(self.BinOp.Expr-"a","b")[0] in self.Set
Поскольку Sympy.solve возвращает список всех решений, индексация с 0 позволит найти единственное решение (есть доказательство того, что существует только 1 такое значение).
Проблема:
Ожидается, что запуск G.HasIdentity в групповой структуре G с Set: Integer и двоичной операцией: ADD (оба определены ранее) приведет к True.
Однако этот оператор вернет False. Пытаясь определить ошибку, я проверил функцию Condition на соответствие ожидаемому результату решения (0) и получил ожидаемый результат (), подтверждающий, что 0 находится в наборе целых чисел. Поскольку это условие содержит только одну базовую булеву операцию, я пришел к выводу, что тип вывода Sympy.solve был другим, и с помощью функции type() определил его как Sympy.core.numbers.Zero< /code>.
При тестировании других выражений равенства на воспроизводимость, таких как Sympy.solve(x-2,x), вместо этого выходные данные представляют собой экземпляр Sympy.core.numbers.Integer с внутренней ценностью 2. При печати функции mro() Sympy.core.numbers.Zero она выдает список других классов Sympy.core, от которых она наследуется. В этот список не включены какие-либо собственные классы Python (кроме объекта), в которых можно было бы ожидать, что Sympy.core.numbers.Integer (который Sympy.core.numbers.Zero наследует от ) будет наследовать от int.
Я ожидал, что Sympy.solve вернет то же решение, но как собственный тип Python.
Меня интересует только решение одномерные функции, и поэтому случай, когда решение является экземпляром Sympy.Expr, не имеет значения (решения никогда не будут выражаться в терминах других переменных).
Я знаю, что можно явно привести выходные данные к типу в целое число/с плавающей запятой и т. д., но приведение всех выходных данных Sympy.solve к int приведет к тому, что значения не будут соответствовать условиям, допускающим только числа с плавающей запятой, и наоборот. Поэтому это не совсем вариант. Я ищу решение, которое преобразует вывод в его собственный тип Python, например. вывод 0,5 в число с плавающей точкой, а вывод *i* в комплекс. Обратите внимание, что приведение переменной к определенному типу приведет к тому, что она будет присвоена этому типу, например, float(0) и complex(0) больше не являются экземплярами intМожно настроить сопоставление (вероятно, в виде словаря классов Sympy в качестве ключей и соответствующих классов Python в качестве значений), а затем запустить приведение типов через это, но я искал более элегантное решение .
Посмотрев в Интернете, Мне не удалось найти общее решение этой проблемы, которое могло бы привести решение Sympy.solve к собственному Python.
В качестве примечания: если кто-нибудь может объяснить, почему Sympy предпочитает возвращать свои значения в таком виде, что будет оценено по достоинству.

Подробнее здесь: https://stackoverflow.com/questions/792 ... -to-python
Ответить

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

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

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

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

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