5

Python 3.2 と C++ を使用しています。

現在 PyObject に格納されている C 型の種類を抽出する必要があります。私はドキュメントをチェックしてグーグルで検索しましたが、他の誰もこれを行う必要がないようです。

だから私は PyObject を持っていて、C 値を抽出しようとしています。オブジェクトから実際に値を抽出するために必要な関数のリストがありますが、最初に知る必要があるのは、正しい関数を呼び出すためにオブジェクト自体に格納されているものです。

これが理解に役立つ場合に備えて、ここに私が試みているコードの例を示します。

//Variable is a custom variant type to allow for generic functionality.
Variable ExtractArgument( PyObject * arg )
{
  Variable value;
  PyObject* result;
  //now here is the problem, I need to know which Python function to call in order to
  //extract the correct type;
  value = PyLong_FromLong( arg );
  //or 
  value = PyFloat_FromDouble( arg )
  //ect.
  return value;
}

うまくいけば、私はこのようなものを手に入れることができます

Variable ExtractArgument( PyObject * arg )
{
  Variable value;
  PyObject* result;
  //PyType is not the actual variable to that holds the type_macro, GetType should be
  //replaced by the function I am trying to find 
  PyType type = GetType( arg ); 
  switch( type )
  { 
    case T_INT: value = static_cast<int>(PyLong_FromLong( arg  )); 
      break;
    case T_FLOAT: value = static_cast<float>(PyFloat_FromDouble( arg  ));
      break;
    case T_DOUBLE: value = PyDouble_FromDouble( arg );
      break;
    //ect.
  }
  return value;
} 

この質問が長すぎたり、情報が多すぎたりして申し訳ありません。初めての投稿で、役立つ可能性のあるものを残したくありませんでした。この問題について私に与えることができる助けや洞察をありがとう.

4

2 に答える 2

5

Python オブジェクトには C 型はなく、Python 型があります。たとえば、整数は C の long または long 整数にすることができます。PyInt_Check(obj)、などでタイプを確認できPyList_Check(obj)ます。それが true を返す場合、そのタイプのオブジェクトがあることがわかります。

などは逆になることに注意してくださいPyLong_FromLong。それらは C の値を取り、それを PyObject* に変換します。したがって、それらを逆に使用しています。私はあなたが意味したと思いますPyInt_AsLong

于 2011-05-23T22:52:16.487 に答える
1

これは、Python の型がどのように機能するかということではありません。それらは C 型に 1 対 1 でマップされません。特定の値がどの C 型に適合するかを示す Python C/API 関数はありません。ただし、型をチェックする (およびサブクラスも考慮する) および のような関数があります。PyFloat_Check()(およびそのバリアント) は、渡された引数を適切に変換するよう Python に指示します。PyInt_Check()PyArg_ParseTuple()

通常は後者を使用します。C 関数に渡された引数を でデコードし、PyArg_ParseTuple()異なる型を別の方法で処理する必要がある場合は、それらを異なる引数として (通常は名前付き引数として) 渡します。そのアプローチがうまくいくかどうかは明らかではありません。2 番目によくあるのは、最初に型チェックを行わずに、別の関数を使用して引数を変換しようとすることです。失敗した場合は、単純に別の変換関数を試します。明示的な型チェックは、一般的に最も一般的でない代替手段です。

于 2011-05-23T22:52:50.270 に答える