namedtuple
は、純粋にPythonで実装されています。その完全なソースはcollections.pyで見ることができます。それは非常に短いです。覚えておくべきことは、namedtuple
自体が呼び出されたフレームにクラスを作成し、このクラス(このクラスのインスタンスではない)を返す関数であるということです。インスタンスの作成に使用されるのはこの返されたクラスです。ですから、あなたが得るオブジェクトは、個々のインスタンスを渡す場合、C++に渡すものではありません。
C++はコンパイル時にstruct
の定義を作成します。 namedtuple
は、実行時にnamedtupleクラスを作成します。それらをC++構造体にバインドする場合は、PyObjectを使用して、新しく作成されたクラスのインスタンスをC++内に作成し、コンパイル時にstruct
要素に割り当てます。または、新しく作成されたクラスのインスタンスをPythonで作成し、C++に渡します。
_asdict
メソッド(ビルドするすべてのクラスに対してnamedtupleファクトリメソッドによって提供される)を使用して、それをC++に渡して、実行時定義データをコンパイル時に定義されたデータにバインドすることができます。
実際にC++で大量の作業をしたい場合は、namedtupleを使用する代わりにStructモジュールを使用することもできます。
namedtupleは実際にはPythonのスイス軍のナイフで、Pythonにとどまるデータ用です。それは、名前付きアクセス、名前付きアクセスを提供し、すべての要素も "プロパティ"です(したがって、独自のラムダを書く必要はなく、マップ、フィルタなどで使用できるfget
アクセッサメソッドを持っています)。
DBバインディングのようなものです(実行時にどの列が存在するかわからない場合)。あるフォーマットから別のフォーマットへデータを変換するためには、OrderedDictよりも控えめです。このように使用すると、文字列を処理するオーバーヘッドはdbの実際のアクセス(埋め込み)に比べて何もありません。しかし、計算で使われることになっている構造体の大きな配列にはnamedtupleを使用しません。
namedtupleは組み込み関数ではないため、変換に問題が発生することがあります。 namedtupleを最初に(Pythonレベルから)タプルに変換してから、C++拡張モジュールで 'PyArg_ParseTuple'を使用してみてください。 – thorhunter
@thorhunter私はそのショットを与えるでしょう。 PyArg_ParseTupleのドキュメントを読んで、各パーツにアクセスする方法についてちょっと混乱しました。 Pythonが値を格納するために使用したバイト数を正確に知る必要がありますか? – Wired365
いいえ、あなたが知る必要があるのは、渡すタプルの構造だけです。 (int、int、string)を返します。そして 'PyArg_ParseTuple(args、" iis "、&int1、&int2、&str);' for 'int int1; int int2; char * str')変数を使ってCの型にバインドすることができます。これはもちろん基本的な例です。 'PyArg_ParseTuple'やその他のPython API要素を使ってもっと多くのことを行うことができます。Python APIを使用して必要な情報(文字列の長さを含む)をPython APIから抜き出すことができます。 //docs.python.org/2.0/ext/parseTuple.html – thorhunter