問題タブ [pyo3]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
94 参照

python - Rust pyo3 pyclass 構造体の反映された数値エミュレーター (例: __radd__) で PyAny を使用する Python の TypeError

Pyo3 を使用して Python 用の Rust ライブラリを作成しました。__add__これには、 、 などのいくつかの PyNumberProtocol メソッドを実装する pyclass 構造体が含まれており、__sub__+ や - などの python 演算子をクラスで動作させることができます。多くの異なるタイプをサポートしたいので、これらのほとんどで「その他」のオブジェクトとして PyAny を使用しています。それは正常に機能していますが、 や などの反映されたメソッドを実装しようとする__radd____rsub__、python が TypeError をスローします。スローされた TypeError には引数もメッセージもありません。これは単なる空の TypeError です。呼び出してもメソッド自体は機能しますmyitem.__radd__(other)が、other + myitem失敗します。例として i64 を除いてすべてを取り除きました (以下の TestClass1 __add__) 。__radd__

i64 など、特定のタイプの反映されたメソッドを実装できます (以下の TestClass2 を参照)。しかし明らかに、これは異なるタイプ (フロート、リスト、クラスなど) を許可しません。機能するジェネリック型も、メソッドをオーバーロードする方法も見つかりませんでした__radd__。私の質問は、__radd__Python から複数の型を受け入れるように実装する方法はありますか? 私はRustにかなり慣れていないので、おそらく何か明らかなことを見逃しています...

Rust サンプル ライブラリ:

Python の例では、最後の行を除いて、すべての print ステートメントが期待どおりに機能します。

Rust 1.45.2、pyo3 0.11.1、python 3.7.3 を使用しています

0 投票する
1 に答える
270 参照

python - 別のクレートの型を含む錆構造体で pyo3 pyclass を使用する

Pythonでの使用を許可するために、pyo3 pyclass マクロを使用する錆構造体があります。これは単純な構造体では問題なく機能しますが、別のライブラリの型を含む構造体があると、より困難になります。

例:

上記では、rust geo ライブラリの Point タイプを使用しています。コンパイラは、次のエラーを提供します。 the trait `pyo3::PyClass` is not implemented for `geo::Point<f64>

Point に PyClass を実装しようとすると、次のようになります。

次のコンパイラ エラーが表示されます。 impl doesn't use only types from inside the current crate

これを解決するためのクリーンでシンプルな方法に関するアイデアはありますか?

0 投票する
1 に答える
322 参照

python - PyArray を Vec に変換するにはどうすればよいですか> さびで

Rust で numpy クレートを使用して、Python からの 2D 配列を操作しています。PyArray( https://docs.rs/numpy/0.11.0/numpy/array/struct.PyArray.html ) は、a を(2D PyArray) にfrom_vec2()変換する関数と、2D 配列を a に平坦化する関数を実装します。 1D ベクトルと を返しますが、実装しません。私が見逃しているこの変換を行う簡単な方法はありますか、またはこの関数を手動で実装する必要がありますか?Vec<Vec<T>>PyArray<T, 2>to_vec()Vec<T>to_vec2()

ありがとう。