CPython 'overloaded'函数
CPython 'overloaded' functions
我正在尝试重载一个接受对象或字符串的 python 扩展函数。
typedef struct
{
PyObject_HEAD
} CustomObject;
PyObject* customFunction(CustomObject* self, PyObject* args);
PyMethodDef methods[] =
{
{"customFunction", (PyCFunction) customFunction, METH_VARAGS, "A custom function"},
{NULL}
}
PyTypeObject TypeObj =
{
PyVarObject_HEAD_INIT(NULL, 0)
.tp_name = "customModule.CustomObject",
.tp_doc = "Custom Object",
.tp_basicsize = sizeof(CustomObject),
.tp_itemsize = 0,
.tp_flags = Py_TPFLAGS_DEFAULT,
.tp_methods = methods,
}
// Area of problem
PyObject* customFunction(CustomObject* self, PyObject* args)
{
const char* string;
PyObject* object;
if (PyArg_ParseTuple(args, "O!", &TypeObj, &object)) // TypeObj is the PyTypeObject fpr CustomObject
{
std::cout << "Object functionn"
// Do whatever and return PyObject*
}
else if (PyArg_ParseTuple(args, "s", &string))
{
std::cout << "String functionn"
// Do whatever and return PyObject*
}
return PyLong_FromLong(0); // In case nothing above works
}
在python中,除了函数之外,我有一个尝试,我得到这个错误Error: <built-in method customFunction of CustomModule.CustomObject object at 0xmemoryadress> returned a result with an error set
以下是此PyArg_ParseTuple的 Python 文档:
int PyArg_ParseTuple(PyObject *args, const char *format, ...(
解析仅将位置参数转换为局部变量的函数的参数。成功时返回 true;失败时,它返回 false 并引发相应的异常
我猜PyArg_ParseTuple正在设置错误,这导致整个函数不起作用(我在模块的方法表中确实有 customFunction,我只是省略了该代码(。如果我有以下 Python:
import CustomModule
try:
CustomModule.customFunction("foo")
except Exception as e:
print("Error:", e)
String function
确实会输出,因此字符串 if 语句中的代码确实有效,但我假设发生错误是因为对象的PyArg_ParseTuple失败,因此它返回错误(不是 100% 确定这是否正确(。
有没有办法防止 PyArg_ParseTuple(( 引发错误,是否有其他函数,或者有更好的方法来"重载"我的自定义函数?
我可能只是使用PyArg_ParseTuple
来获取一个通用的未指定对象,然后稍后使用Py*_Check
处理对象类型:
if (!PyArg_ParseTuple(args, "O", &object)) {
return NULL;
}
if (PyObject_IsInstance(object, (PyObject*)&PyType)) { // or a more specific function if one exists
std::cout << "Object functionn";
} else if (PyUnicode_Check(object)) {
std::cout << "String functionn";
} else {
// set an error, return NULL
}
原因是Python的"请求宽恕,而不是许可"模式
try:
something()
except SomeException:
somethingElse()
不能很好地转换为 C,并且涉及相当多的代码来处理异常。如果你真的想这样做,那么你需要在第二个PyArg_ParseTuple
之前调用PyErr_Clear
,理想情况下,你应该检查它是你认为的异常,而不是完全是其他东西。
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- CPython 'overloaded'函数
- (C++)构造函数、默认参数"call of overloaded... ambigous"
- C++ 与函数联合,Arduino编译器错误"cannot be overloaded"
- "unresolved overloaded function type"错误并将运算符作为函数参数传递
- 派生类的新构造函数未生成:"overloaded member function not found"
- 在 std::function 中使用静态函数的"unresolved overloaded function type"
- 错误:调用'sort(..., ..., <unresolved overloaded function type>)'没有匹配函数
- C++函数重载,调用"overloaded"函数
- 从 boost::thread 调用模板化函数时"unresolved overloaded function type"
- 模板函数指针:"overloaded function with no contextual type information"
- 调用'QDomDocument::createElement(<unresolved overloaded function type>)'没有匹配函数