【问题标题】:Overloading embedded Python functions using PyArg_ParseTuple使用 PyArg_ParseTuple 重载嵌入式 Python 函数
【发布时间】:2010-02-18 19:54:16
【问题描述】:

如果我试图重载嵌入式 Python 函数,以便第二个参数可以是 long 或 Object,是否有标准的方法来做到这一点?是这个吗?

我现在正在尝试的事情(更改名称以保护无辜者):

  bool UseLongVar2 = true;
  if (!PyArg_ParseTuple(args, "ll:foo", &LongVar1, &LongVar2))
  {
      PyErr_Clear();
      if (!PyArg_ParseTuple(args, "lO&:foo", &LongVar1, convertObject, &Object))
      {
         UseLongVar2 = false;
         return NULL;
      }
  }

【问题讨论】:

    标签: python overloading embedded-language


    【解决方案1】:

    我通常做的是有两个接受不同参数的 C 函数。 “面向 python”的函数的工作是解析参数,调用适当的 C 函数,并构建返回值(如果有)。

    这很常见,例如,当您希望同时允许字节和 Unicode 字符串时。

    这是我的意思的一个例子。

    // Silly example: get the length of a string, supporting Unicode and byte strings
    static PyObject* getlen_py(PyObject *self, PyObject *args)
    {
        // Unpack our argument (error handling omitted...)
        PyObject *arg = NULL;
        PyArg_UnpackTuple(args, "getlen", 1, 1, arg) ;
    
        if ( PyUnicode_Check(arg) )
        {
            // It's a Unicode string
            return PyInt_FromLong(getlen_w(PyUnicode_AS_UNICODE(arg))) ;
        }
        else
        {
            // It's a byte string
            return PyInt_FromLong(getlen_a(PyString_AS_STRING(arg))) ;
        }
    }
    

    【讨论】:

    • 这与我在这里所做的有什么不同?在示例代码之后,我可以说“result = UseLongVar2 ? fooLong(LongVar1, LongVar2) : fooObj(LongVar1, Object)”?
    • 只是澄清一下:我对如何分辨从 Python 传递的参数类型很感兴趣。有没有比 PyArg_ParseTuple 更好的东西,或者是否有更简洁的速记来分离不同类型的变量。我使用的结构对于可能有 2 或 3 种可能类型的几个参数来说是完全可怕的。
    • 这是不同的,因为按照你的方式,你正在做两个测试。首先测试是否通过,然后您必须测试您设置的标志以查看要解析的参数。按照我概述的方式,您只需进行一项测试。不,我认为没有更清洁的方法来检查你得到的参数。另一个让 C 扩展中的参数保持简单的好理由。
    • 您没有概述用于解析参数的结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    相关资源
    最近更新 更多