在 Sympy 中定义一个新的逻辑操作
Define a new logical operation in Sympy
我一直在阅读 Sympy 的源代码,试图弄清楚我是否可以添加自己的逻辑操作。这是定义逻辑操作的地方:
https://github.com/sympy/sympy/blob/master/sympy/logic/boolalg.py
是否可以不修改库本身?
我假设我需要创建一个扩展 BooleanFunction 的 class 但随后在这段代码中:
class Boolean(Basic):
"""A boolean object is an object for which logic operations make sense."""
__slots__ = []
def __and__(self, other):
"""Overloading for & operator"""
return And(self, other)
__rand__ = __and__
def __or__(self, other):
"""Overloading for |"""
return Or(self, other)
__ror__ = __or__
def __invert__(self):
"""Overloading for ~"""
return Not(self)
def __rshift__(self, other):
"""Overloading for >>"""
return Implies(self, other)
def __lshift__(self, other):
"""Overloading for <<"""
return Implies(other, self)
__rrshift__ = __lshift__
__rlshift__ = __rshift__
def __xor__(self, other):
return Xor(self, other)
__rxor__ = __xor__
如何在不修改 class 的情况下添加新操作?
你应该 subclass sympy.logic.boolalg.BooeanFunction
(或者只是 Boolean
如果你的对象不是一个函数)。 BooleanFunction 本身是 Function 的子class,这意味着您使用与 Function 相同的行为来定义其操作,即定义 class 方法 eval
其中 returns 值当您希望对象求值,以及 None 何时应保持不求值。例如参见 [=14=] 的定义。
如果您的操作是格运算符(如 And 和 Or),您也可以使用 LatticeOp,这会简化它们的定义。
至于运算符本身,如果您想重载运算符,请在 class 上为它定义 __method__
。 Python 只允许重载某些 specific operators,并且您不能更改它们的优先级,因此根据您的运算符是什么,可能没有您可以为其定义的合理运算符,在这种情况下,您将需要使用函数符号。
我一直在阅读 Sympy 的源代码,试图弄清楚我是否可以添加自己的逻辑操作。这是定义逻辑操作的地方: https://github.com/sympy/sympy/blob/master/sympy/logic/boolalg.py
是否可以不修改库本身? 我假设我需要创建一个扩展 BooleanFunction 的 class 但随后在这段代码中:
class Boolean(Basic):
"""A boolean object is an object for which logic operations make sense."""
__slots__ = []
def __and__(self, other):
"""Overloading for & operator"""
return And(self, other)
__rand__ = __and__
def __or__(self, other):
"""Overloading for |"""
return Or(self, other)
__ror__ = __or__
def __invert__(self):
"""Overloading for ~"""
return Not(self)
def __rshift__(self, other):
"""Overloading for >>"""
return Implies(self, other)
def __lshift__(self, other):
"""Overloading for <<"""
return Implies(other, self)
__rrshift__ = __lshift__
__rlshift__ = __rshift__
def __xor__(self, other):
return Xor(self, other)
__rxor__ = __xor__
如何在不修改 class 的情况下添加新操作?
你应该 subclass sympy.logic.boolalg.BooeanFunction
(或者只是 Boolean
如果你的对象不是一个函数)。 BooleanFunction 本身是 Function 的子class,这意味着您使用与 Function 相同的行为来定义其操作,即定义 class 方法 eval
其中 returns 值当您希望对象求值,以及 None 何时应保持不求值。例如参见 [=14=] 的定义。
如果您的操作是格运算符(如 And 和 Or),您也可以使用 LatticeOp,这会简化它们的定义。
至于运算符本身,如果您想重载运算符,请在 class 上为它定义 __method__
。 Python 只允许重载某些 specific operators,并且您不能更改它们的优先级,因此根据您的运算符是什么,可能没有您可以为其定义的合理运算符,在这种情况下,您将需要使用函数符号。