【问题标题】:Why PyCallable_Check() returns 0 on global class instances?为什么 PyCallable_Check() 在全局类实例上返回 0?
【发布时间】:2022-01-06 10:49:29
【问题描述】:

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

现在困扰我的是,如果我获得某个类的特定全局实例(在 python 脚本中)的对象引用(在 C++ 中),PyCallable_Check() 在检查此引用时给我 0 作为返回,即使我'我实际上可以调用它。由于这是可能的,我想这里有一个 tp_call 成员(因为在我的示例中我没有 __call__ 方法)。

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

C++ sn-p 示例:

//...

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

【问题讨论】:

    标签: python c++ instance callable python-embedding


    【解决方案1】:

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

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

    【讨论】:

    • 好的,谢谢,我想我必须深入了解一下python
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    相关资源
    最近更新 更多