Python-带“的数值类;don';t care“;价值观

Python-带“的数值类;don';t care“;价值观,python,numpy,bits,Python,Numpy,Bits,我正在尝试创建一个简单的数据类型,用作Numpy数组的数据类型,并可以对其执行元素级的加法、减法和比较。该类型应具有(至少)三个值,分别表示true、false和“不在乎”(DC)。后者等于true和false,在加法和减法中的行为类似于零: >>> MyDtype(True) == MyDtype(DC) == MyDtype(True) # note reflection True >>> MyDtype(False) == MyDtype(DC)

我正在尝试创建一个简单的数据类型,用作Numpy数组的数据类型,并可以对其执行元素级的加法、减法和比较。该类型应具有(至少)三个值,分别表示true、false和“不在乎”(DC)。后者等于true和false,在加法和减法中的行为类似于零:

>>> MyDtype(True) == MyDtype(DC) == MyDtype(True)    # note reflection
True
>>> MyDtype(False) == MyDtype(DC) == MyDtype(False)  # ditto
True
>>> MyDtype(True) == MyDtype(False)
False
>>> MyDtype(True) - MyDtype(DC) == MyDtype(True)
True
>>> MyDtype(DC) + MyDtype(False) == MyDtype(False)
True

我完全搞不懂如何以理智的方式获得这些语义。

您可以使用神奇的函数来控制类对象上的算术运算。如果左侧的对象未实现相应的非反射操作,则您甚至可以控制反射操作

在这里可以找到魔术方法的全面文档(链接指算术运算符部分,后面是关于反射算术运算的部分):

我也遇到了同样的问题,并编写了一个对象为dontcare符号的类。这并不完全是您所要求的,因为它没有包装值,但它应该很容易适应您的需要。 你可以在这里找到它:


没有合理的方法来获取这些语义,因为语义是不合理的。等式应该是可传递的,您想要的语义不是可传递的(
M(True)==M(DC)
M(DC)==M(False)
但是
M(True)!=M(False)
)。你想用这个干什么。你关于等式是可传递的观点被很好地理解了:也许我根本不应该使用等式操作符,也许一个实例方法会更好。至于我试图做什么(最终),我正在实施。也许你在寻找?虽然这可以从理论上回答这个问题,但在这里包括答案的基本部分,并提供链接供参考。
from symbols import dontcare

True == dontcare == True
>>> True
False == dontcare == False
>>> True
True == False
>>> False
True - dontcare == True
>>> True
dontcare + False == False
>>> True