【问题标题】:How to find the number of parameters to a Python function from C?如何从 C 中找到 Python 函数的参数数量?
【发布时间】:2009-07-12 23:09:18
【问题描述】:

我正在使用 Python C API 从我的应用程序中调用 Python 函数。我想提供一个可以调用的函数列表,并希望能够将此列表限制为仅具有预期参数数量的函数。

我很高兴我可以通过字典来提取函数列表并使用PyCallable_Check 来确定它们是否可调用,但我不确定如何找出每个函数有多少个参数期待吗?

我发现了一种涉及 Boost::Python 的技术,但我不想添加它,因为(我希望!)将是一个小添加。

谢谢:)

【问题讨论】:

    标签: python c


    【解决方案1】:

    好的,所以最后我发现了如何做到这一点。用户定义的 Python 函数有一个名为 func_code 的成员(在 Python 3.0+ 中是 __code__),它本身也有一个成员 co_argcount,这大概是 Boost::Python 在 Christophe 给出的示例中提取的内容。

    我使用的代码看起来像这样(它很大程度上基于如何遍历 Python 字典的文档示例):

       PyObject *key, *value;
       int pos = 0;
       while(PyDict_Next(pyDictionary, &pos, &key, &value)) {
          if(PyCallable_Check(value)) {
             PyObject* fc = PyObject_GetAttrString(value, "func_code");
             if(fc) {
                PyObject* ac = PyObject_GetAttrString(fc, "co_argcount");
                if(ac) {
                   const int count = PyInt_AsLong(ac);
                   // we now have the argument count, do something with this function
                   Py_DECREF(ac);
                }
                Py_DECREF(fc);
             }
          }
       }
    

    无论如何,谢谢 - 该线程确实将我引向了正确的方向:)

    【讨论】:

      【解决方案2】:

      Maybe this is helpful?(未测试,此线程中可能有相关信息)...

      【讨论】:

      • 我赞成,因为确实有相关的信息:)
      【解决方案3】:

      您的 C 代码可以像任何 Python 代码一样调用 inspect.getargspec(例如,通过 PyObject_CallMethod 或其他等效方式),并获取有关每个函数的签名或它可能关心的其他可调用对象的所有信息。

      【讨论】:

        猜你喜欢
        • 2010-10-25
        • 1970-01-01
        • 2017-04-01
        • 2013-06-29
        • 1970-01-01
        • 2017-10-20
        • 2011-06-01
        • 1970-01-01
        相关资源
        最近更新 更多