用Python修补的SIP包装的C类
|
我正在一些C库上创建一个
Python包装器,实现一些低级别的M2M通信.我正在使用Riverbank的SIP包装器生成器.
C类有一个方法: class Bar {
public:
enum Status {
...
};
void setStatus(Status s);
Status getStatus() const;
...
};
该类包含在模块foo中. SIP使用它自己的枚举类型,但由于一些原因,我想使用标准库中的Python 3.4枚举. 我没有看到任何从Python C API访问Python定义的类的机会,我决定在__init__.py中修补包装类.主要原因是我想在C/C++ / SIP中进行脏的低级工作,并在Python中修改类(比如使用合理的错误消息添加参数验证). Python __init__.py部分看起来像这样(或多或少): from foo import Bar
class Status(IntEnum):
ONE = 1
TWO = 2
... and so on ...
Status.__module__ = 'Bar.Status'
Bar.Status = Status
Bar.status = property(...)
Bar.status将接受并返回漂亮的pythonic Bar.Status枚举. 预期结果是这样的: class Bar(object):
class Status(IntEnum):
...
...
我想知道这种方法是否有任何问题,特别是在导入时修补对象. 解决方法
我用其他似乎没问题的方式解决了这个问题.
让我们考虑一个包含两个类的C库: > Foo 包装库包含包libfoo(在Python C API中创建)和pythonic包foo(在普通python中创建).我们不直接访问libfoo包,但导入foo. 包foo的__init__.py: from libfoo import Foo,FooFactory
# both are naked wrappers with ugly API derived from C++
# I defined some pythonic sugar that makes them nice to use
class FooPythonicGoodies(object):
# add pythonic goodies here
def quack(self):
pass
# Merge them
Foo.__bases__ = Foo.__bases__ + (FooPythonicGoodies,)
现在,在源代码中的任何地方我这样做: from foo import Foo,FooFactory a = Foo() a.quack() # Factory is a C++ wrapped class that returns wrapped foo # objects WITH FooPythonicGoodies! factory = FooFactory() b = factory.create_foo() b.quack() # that works too! 这样我就可以使用pythonic API糖来抛光相当不同于pythonic的C类. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
