为什么 PyCallable_Check() returns 0 在全局 class 实例上?

Why PyCallable_Check() returns 0 on global class instances?

现在我正致力于将 python 嵌入到更大的 C++ 应用程序中。尽管我不是 python 专家,但我知道使用内置 PyCallable_Check() 我可以检查 python 对象是否实际上是可调用的。从 What is a "callable"? 我发现它取决于 classes 中可用的 __call__ 方法或具有非空 tp_call 成员的类型。

现在困扰我的是,如果我得到一个对象引用(在 C++ 中)到某些 class(在 python 脚本中)的特定全局实例,PyCallable_Check() 给出me 0 as return 检查此引用时,即使我实际上能够调用它。因为这是可能的,所以我假设这里有一个 tp_call 成员(因为在我的示例中我没有 __call__ 方法)。

那我错过了什么?为什么我得到 0 作为 return?

示例 C++ 片段:

//...

PyObject* pModule = PyImport_Import( PyUnicode_DecodeFSDefault("testfile") );
PyObject* pGlobalObj = PyObject_GetAttrString( pModule, "globalObj" );

int ok = PyCallable_Check(pGlobalObj)
if( !ok )
{
     std::cerr << "Not a callable?!" << std::endl;
     std::cerr << "PyCallable_Check() gives: " << ok << std::endl;
}
//call class method anyway...
PyObject* pValue = PyObject_CallMethod( pGlobalObj , "add", "(ii)", 45, 55 );
std::cout << "Global object result: " << PyLong_AsLong(pValue) << std::endl;

//...

与以下 testfile.py:

class TestClass:
    def add(self, a, b):
        return a + b

globalObj = TestClass()

给出:

>> Not a callable?!
>> PyCallable_Check() gives: 0
>> Global object result: 100

那不是可调用的。您可能误解了“可调用”的含义。

如果 globalObj 是可调用的,您将能够执行 globalObj(),也许在括号之间使用一些适当的参数。你不能。