为什么不同情我的符号?

时间:2017-02-06 16:17:57

标签: python sympy

我的符号定义如下:

type login struct {
    Seq      uint8
    ID       uint16
    Username [16]byte
    Password [16]byte
    Unknown1 [16]byte
}

(上面的代码是可运行的)。现在,当我尝试将它们放在import sympy class construct(object): def __init__(self, value): self.value = value def __add__(self, symbol): return construct(self.value+symbol.value) def __mul__(self,symbol): return construct(self.value*symbol.value) a = construct(2) b = construct(10) 矩阵中时,它会引发错误,我无法弄清楚原因:

sympy

我根本不在这里使用字符串,所以我不确定为什么它会抱怨解析错误。

2 个答案:

答案 0 :(得分:1)

错误消息中的<__main__.construct object at 0x1088a5ad0>是默认construct.__str__()方法返回的内容。我注意到,一旦该方法被一个返回construct.value的字符串表示的方法覆盖,那么使用sympy.sympify()(包括sympy.Matrix())的任何内容都会接受它。我不知道这是SymPy想要转换现有自定义对象的方式 - 可能有更理想的方式。

import sympy

class construct(object):

    def __init__(self, value):
        self.value = value

    def __add__(self, symbol): 
        return construct(self.value+symbol.value)

    def __mul__(self,symbol):
        return construct(self.value*symbol.value)

    def __str__(self):
        return str(self.value)

a = construct(2)
b = construct(10)
print(sympy.Matrix([[a],[b]])) # will output 'Matrix([[2], [10]])'

如果我只使用SymPy类这样做,我会使用以下内容:

import sympy
a,b = sympy.symbols('a b')
a = 2
b = 10
print(sympy.Matrix([[a],[b]])) # will output 'Matrix([[2], [10]])'

答案 1 :(得分:1)

您需要将SymPy的类子类化,以创建在SymPy中使用的新对象。通常,您将Function(用于定义函数,类似于sinlog)或Expr作为一般表达式的子类。该类应具有args属性,并且可以使用obj.func(*obj.args)进行重新计算(默认情况下obj.func等于对象类。)

我无法提供更多有关细节的建议,因为您提供的示例类非常简单,正如@Christopher Chavez指出的那样,您可以使用符号。但是根据您想要做的事情,您可以在子类中覆盖各种方法。一个很好的参考是查看SymPy源代码,因为SymPy附带的所有对象都使用此模型。