【发布时间】:2014-06-20 04:46:29
【问题描述】:
对于冗长的背景信息,我提前道歉。
我最近一直在玩 Python/C-API(Python 3.4)并且被难住了。我的目标是拥有一个可以用作函数/方法装饰器的 C 扩展。我有一个相当不错的 LRU 缓存原型,https://gist.github.com/pbrady/916495198910e7d7c713。虽然缓存可以工作并且速度非常快,但存在两个问题:
-
my 装饰器返回的
type不是函数:即>>> from lrucache import lrucache >>> @lrucache() ... def f(a, b): ... return a+b ... >>> type(f) >>> <class 'lrucache.cache'>因此,装饰器无法在方法上正常工作 - 似乎
self迷路了,因为 Python 在看到我的类时没有创建实例方法(这是有道理的)。 将
__doc__从修饰函数复制到我的缓存类不会影响help显示的消息。
我解决这些问题的想法是简单地返回带有一些修改的用户函数,而不是一个新的自定义类对象。这些修改是
给函数添加
__wrapped__属性并指向函数。覆盖
__call__属性,以便将函数调用定向到自定义 C 例程。
我能够完成 (1),但是覆盖函数 __call__ 方法并没有做任何事情,因为解释器通常不使用它。
我的问题(最后): 如何创建将调用 C 函数的 Python 函数(即 PyFunctionObject)?
或者,如果有更好的方法来做到这一点,我也会对此感兴趣。这主要是一个学习/有趣的练习,所以我对基于 Cython 的解决方案不太感兴趣。
【问题讨论】:
-
我没有直接使用 Python/C-API,但也许(因为这是一个学习/有趣的练习)尝试在 python 中创建一个调用 C 函数的装饰器。或者创建一个简单的 C 装饰器,它返回正确的函数值/类型(取决于它的丑陋程度)。抱歉不知道解决办法。
标签: python c decorator python-c-api