为什么 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()
,也许在括号之间使用一些适当的参数。你不能。
现在我正致力于将 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()
,也许在括号之间使用一些适当的参数。你不能。