如何更好地控制python C API中的序列属性?

时间:2016-12-21 05:19:10

标签: python python-c-api

我试图通过C / C ++向python添加一个新的类/类型。这个特殊的类有一个名为x的矢量属性,它是一个列表,但它只能从正双精度制作。在定义如下时,我使用tp_getset更好地控制设置x

>>> obj.x=[1.0,2.5,3.5]

我可以完全控制属性的设置,并且按预期工作,我可以阻止用户执行:

>>> obj.x=[1.0,2.5,-4]
Traceback (most recent call last):
File "input.py", line 21, in <module>
   obj.x=[1.0,2.5,-4]
ValueError: 'x[2]' should be greater than or equal to 0.

>>> obj.x=[1.0,2.5,'str']
Traceback (most recent call last):
File "input.py", line 21, in <module>
   obj.x=[1.0,2.5,'str'];
TypeError: fialure to deduce C++ type <double*>

并抛出异常。但是,当定义tp_getset.get返回双精度列表对象时,我无法控制执行以下操作的用户:

>>> obj.x=[1.0,2.5,3.5]
>>> obj.x[2]=-3.6

我知道作为最后的手段我只能生成一个列表对象,每次tp_getset.get只有一个引用,并且不在类中保留引用,以便obj.x[2]基本上是临时的,没有任何意义发生

>>>obj.x=[1.0,2.5,3.5]
>>>obj.x[2]='str'
>>>print obj.x
[1.0,2.5,3.5]

我的问题是有一种方法可以对类的序列属性进行这种特定的控制吗?例如。

>>> obj.x=[1.0,2.5,4]
>>> obj.x[2]=-3
File "input.py", line 21, in <module>
   obj.x[2]=-3
ValueError: 'x[2]' should be greater than or equal to 0.

编辑:我刚添加了更多细节以便澄清

0 个答案:

没有答案