2

埋め込まれたPython関数をオーバーロードして、2番目の引数を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;
      }
  }
4

1 に答える 1

3

私が通常行うことは、異なる引数を取る 2 つの 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))) ;
    }
}
于 2010-02-18T23:14:11.870 に答える