“该类型是另一个 C 函数的返回类型——这是创建这种类型实例的唯一方式”——这相当令人困惑。我认为您的意思是“AC 函数返回这种类型的实例——这是唯一的方法等等”。
在您的文档中,明确警告调用者不要调用该类型。不要从 C 扩展中导出类型。对于内省返回的实例的人,您无能为力,但那又怎样?这是他们的数据/机器/工作处于危险之中,而不是你的。
[更新(我讨厌用户界面的评论!)]
詹姆斯:“类型......只是从 C 中创建的”:你再次混淆了类型及其实例。该类型是在 C 中静态创建的。您的 C 代码包含该类型以及用户打算调用以获取该类型实例的工厂函数。由于某种你没有解释的原因,如果用户通过直接调用类型来获取实例,后续的 instance.method() 调用将崩溃(我想这就是你所说的“在对象上调用函数”的意思。叫我疯了,但这不是您应该修复的错误吗?
重新“不要出口”:尝试“不要暴露”。
在您的 C 代码中,您将拥有类似这样的内容,其中列出了模块提供的所有 API,包括类型和函数:
static struct PyMethodDef public_functions[] = {
{"EvilType", (PyCFunction) py_EvilType, ......},
/* omit above line and punters can't call it directly from Python */
{"make_evil", (PyCFunction) py_make_evil, ......},
......,
};
module = Py_InitModule4("mymodule", public_functions, module_doc, ...