回答編集履歴

6

タイポ

2019/04/05 14:34

投稿

kngwyu
kngwyu

スコア48

test CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  そういう使い方は想定していません。
24
24
 
25
- 今回の例だと`&PyLIst`から`&PyAny`へアップキャスト(コスト0常に可能、`as_ref`を使ってます). `&PyAny` から`FromPyObject::extract` でVecに変換しています。
25
+ 今回の例だと`&PyLIst`から`AsRef::as_ref`で`&PyAny`へアップキャスト(この操作は0コストです)して、 `&PyAny` から`FromPyObject::extract` でVecに変換しています。
26
26
 
27
27
  基本的には`FromPyObject`でたいてい事足りると考えていいです。
28
28
 

5

さらに補足

2019/04/05 14:34

投稿

kngwyu
kngwyu

スコア48

test CHANGED
@@ -22,9 +22,11 @@
22
22
 
23
23
  そういう使い方は想定していません。
24
24
 
25
- 今回の例だと`&PyLIst`から`&PyAny`へアップキャスト(コスト0で常に可能、`as_ref`を使ってます)->`impl FromPyObject for Vec` でVecに変換う感じで
25
+ 今回の例だと`&PyLIst`から`&PyAny`へアップキャスト(コスト0で常に可能、`as_ref`を使ってます). `&PyAny` から`FromPyObject::extract` でVecに変換してす。
26
26
 
27
- あまりこのへんのインターフェース洗練されていなく、もう少し一貫性が欲しところです
27
+ 基本的に`FromPyObject`でたいてい事足りると考えていです。
28
+
29
+ ただこのへんの設計は今後大きく変わる可能性があり、0.7以降ではどうなるかわかりません(このアップキャストは無駄なので、改善が必要かなと思っています)。
28
30
 
29
31
 
30
32
 
@@ -32,7 +34,7 @@
32
34
 
33
35
  たしかドキュメントに`PyObject::extract`を使え的な記述があったかと思いますが、これはrust-cpython時代から更新されていない記述です(直そうとは、思ってたんですけど)。
34
36
 
35
- PyObjectを経由すると、少しオーバーヘッドになるので、あまり良くないです。
37
+ `&Py~`を持っているときにPyObjectを経由してなにかしようとすると、少しオーバーヘッドになるので、あまり良くないです。
36
38
 
37
39
 
38
40
 

4

補足

2019/04/05 14:33

投稿

kngwyu
kngwyu

スコア48

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  use pyo3::FromPyObject;
4
4
 
5
- let v2: Vec<usize> = dummy.as_ref().extract().unwrap();
5
+ let v: Vec<usize> = dummy.as_ref().extract().unwrap();
6
6
 
7
7
  ```
8
8
 
@@ -33,3 +33,17 @@
33
33
  たしかドキュメントに`PyObject::extract`を使え的な記述があったかと思いますが、これはrust-cpython時代から更新されていない記述です(直そうとは、思ってたんですけど)。
34
34
 
35
35
  PyObjectを経由すると、少しオーバーヘッドになるので、あまり良くないです。
36
+
37
+
38
+
39
+ (補足)
40
+
41
+ ```rust
42
+
43
+ use pyo3::ObjectProtocol;
44
+
45
+ let v: Vec<usize> = dummy.extract().unwrap();
46
+
47
+ ```
48
+
49
+ これもできます

3

誤った記述を修正

2019/04/05 14:24

投稿

kngwyu
kngwyu

スコア48

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  use pyo3::FromPyObject;
4
4
 
5
- let v: Vec<usize> = dummy.extract().unwrap();
5
+ let v2: Vec<usize> = dummy.as_ref().extract().unwrap();
6
6
 
7
7
  ```
8
8
 
@@ -22,9 +22,11 @@
22
22
 
23
23
  そういう使い方は想定していません。
24
24
 
25
- &PyAny -> &PyListなどビルトイン型へのdowncast -> Rustの型へ変換
25
+ 今回の例だと`&PyLIst`から`&PyAny`へアップキャスト(コスト0で常に可能、`as_ref`を使ってます)->`impl FromPyObject for Vec` でVecに変換という感じですね。
26
26
 
27
- というが基本(?)にります。
27
+ あまりこへんインターフェースは洗練さていくて、もう少し一貫性が欲しいところで
28
+
29
+
28
30
 
29
31
  PyObjectはGILGuardとの接し方(?)がPyAny等と異なる型です。
30
32
 

2

古いドキュメントについて加筆

2019/04/05 13:06

投稿

kngwyu
kngwyu

スコア48

test CHANGED
@@ -26,4 +26,8 @@
26
26
 
27
27
  というのが基本の流れ(?)になります。
28
28
 
29
- PyObjectはGILGuardとの接し方(?)がPyAny等と異なる型で、こういう場面では存在を意識しないほうがよいで(このへんは、歴史的事情により面倒な設計になっています)
29
+ PyObjectはGILGuardとの接し方(?)がPyAny等と異なる型です。
30
+
31
+ たしかドキュメントに`PyObject::extract`を使え的な記述があったかと思いますが、これはrust-cpython時代から更新されていない記述です(直そうとは、思ってたんですけど)。
32
+
33
+ PyObjectを経由すると、少しオーバーヘッドになるので、あまり良くないです。

1

他の方の回答についてコメント

2019/04/05 12:46

投稿

kngwyu
kngwyu

スコア48

test CHANGED
@@ -11,3 +11,19 @@
11
11
 
12
12
 
13
13
  また、英語に抵抗がないようでしたら、質問には https://gitter.im/PyO3/Lobby を使うのがいいと思います。
14
+
15
+
16
+
17
+ (他の方の回答について)
18
+
19
+ > PyAnyは、一旦try_into()によりPyObjectに変換した後extract()によりRustの型にキャストするようです。
20
+
21
+
22
+
23
+ そういう使い方は想定していません。
24
+
25
+ &PyAny -> &PyListなどビルトイン型へのdowncast -> Rustの型へ変換
26
+
27
+ というのが基本の流れ(?)になります。
28
+
29
+ PyObjectはGILGuardとの接し方(?)がPyAny等と異なる型で、こういう場面では存在を意識しないほうがよいです(このへんは、歴史的事情により面倒な設計になっています)。