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。
我想知道如何使用 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。