Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果第一个类型是ctypes类型,则不匹配类型的python运算符重载不起作用_Python_Operator Overloading_Ctypes - Fatal编程技术网

如果第一个类型是ctypes类型,则不匹配类型的python运算符重载不起作用

如果第一个类型是ctypes类型,则不匹配类型的python运算符重载不起作用,python,operator-overloading,ctypes,Python,Operator Overloading,Ctypes,代码如下: >>> from ctypes import * >>> class T: ... def __and__(self, other): ... return 1 ... >>> T() & T() 1 >>> T() & "1" 1 >>> T() & 1 1 >>> T() & c_ulong(3) 1 >

代码如下:

>>> from ctypes import *
>>> class T:
...     def __and__(self, other):
...             return 1
...
>>> T() & T()
1
>>> T() & "1"
1
>>> T() & 1
1
>>> T() & c_ulong(3)
1
>>> c_ulong.__and__ = lambda self, other: 1
>>> c_ulong(3) & c_ulong(2)
1
到目前为止一切都很好。但是为什么下面的代码不能在Python 2.7.2中工作呢

>>> c_ulong(3) & T()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for &: 'c_ulong' and 'instance'
>>> c_ulong(3) & 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for &: 'c_ulong' and 'int'
c_ulong(3)和T() 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:&:“c_ulong”和“instance”的操作数类型不受支持 >>>库隆(3)和2 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:&:“c_ulong”和“int”的操作数类型不受支持 对于我定义的类,支持任何类型的第二个操作数似乎没有问题,但是当我将函数附加到ctypes类型时,当第二个操作数是相同类型时调用该函数,但如果操作数是不同类型的,则不会调用该函数。
我确实希望允许ctypes整数和正则整数之间按位and和or运算,结果是ctypes整数。

我无法重现您的错误。所有的案例对我来说都很好,都返回1,甚至最后2个。我得到你所得到的错误的唯一方法是不首先运行lambda。如果我不先运行lambda命令,那么我将得到相同的错误。那么,您确定要先执行lambda命令吗?在Python 2中,
\u SimpleCData
类缺少
Py\u TPFLAGS\u CHECKTYPES
标志,因此必须实现
\uuuuuuuuu强制
@bbkglb,您必须使用Python 3。看,这确实是我要找的。我使用的是Python2.7.2。我想将上面eryksun的答案标记为已接受且正确,但我不知道如何标记,似乎没有相应的按钮。@C.Szabo:他需要将其作为答案发布;评论不能被接受。