Sympy: сокращение пользовательской функции как строки с sympify? - PullRequest
1 голос
/ 23 октября 2019

Есть ли решение для строки sympify (), включая пользовательские методы?

У Sympy есть красивая функция sympify.

  • Может уменьшать строкик симпй-функциям и приведите все выражения. Отлично!
  • Позволяет добавлять функции, способные к симплиции, как класс.

Это официальный пример.

from sympy import Matrix, sympify

class MyList1(object):
    def __iter__(self):
        yield 1
        yield 2
        return
    def __getitem__(self, i): return list(self)[i]
    def _sympy_(self): return Matrix(self)


local_dict= {"MyList1": MyList1}
print(sympify(MyList1()))    # Matrix([[1], [2]])
print(sympify('MyList1()'))  # MyList1()
print(sympify('MyList1()', locals=local_dict))  # <__main__.MyList1 object at 0x0000000006D0AA20>

Последние две строки не могут быть сокращены при помощи sympify - наш класс, очевидно, неизвестен при выражении строки. Помещение класса в 'localals' не сработало для меня.

Есть ли решение для сокращения строк?


Ответы [ 2 ]

1 голос
/ 23 октября 2019

Я бы посчитал это ошибкой в ​​SymPy. По сути, он не вызывает _sympy_, когда создает объект из строки. Вы можете обойти это, дважды позвонив sympify(), например sympify(sympify('MyList1()', locals=local_dict)). При нормальной работе sympify () должен быть идемпотентом, чтобы это не мешало.

1 голос
/ 23 октября 2019

Я думаю, что он сделал то, что вы хотели ... MyList1 не имеет метода для печати, но данные есть:

>>> list(sympify('MyList1()', locals=local_dict))
[1, 2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...