C Python 如何使用 C 在另一个函数中创建一个函数作为装饰器

C Python How to create a function inside another function as a decorator using C

我想知道如何使用 C 在另一个 Python 函数中创建一个 Python 函数? 尝试这样的事情:

static PyObject *func(PyObject *self, PyObject *wrap) { // METH_O
       PyObject *newfunc(PyObject *self, PyObject *args, PyObject *kwds) = { return PyObject_Call(wrap, args, kwds); }
       return newfunc;
}

但是编译器需要另一个表达式。我想知道(或一些线索)来推进我的项目,How to create a function inside another python function using C?

C 没有闭包。您不能在另一个 C 函数内创建一个 C 函数,并允许它访问定义它的函数中的局部变量。即使可以,新的 C 函数也不能直接用作 Python 函数。

可以write Python classes in the Python C API,而且这是在C中写Python装饰器的通常方式。例如,而不是写

def decorator(func):
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    return wrapper

用 C 编写的装饰器看起来更像 API 等同于

class decorator:
    def __init__(self, func):
        self.func = func
    def __call__(self, *args, **kwargs):
        return self.func(*args, **kwargs)

有关如何在 C 中创建 Python 类 的完整详细指南超出了此答案的范围。见 previously linked documentation for a tutorial, and note that the C-level hook for __call__ is the tp_call slot.

您可以查看 functools.partial 的 C 实现作为示例,或者 old 3.6 implementation for a simple example or a more recent version if you want to get fancy with the new vectorcall mechanism