Avatar
@dynamicMemberLookup@dynamicCallable に加えて、 @dynamicConvertible ほしくないですか?今だと PythonObject から Swift に戻すときに↓のようにしないといけなくて面倒。 import Python let np = Python.import("numpy") let a = np.array([[1, 2], [3, 4]]) let b = np.array([[5], [6]]) let c = np.matmul(a, b) let d: Int = Int(c[0, 0])! // ここで明示的変換が必要 print(d)
1:41 AM
前提として Swift では暗黙の型変換は許さないという上で、 @dynamic 系は安全性を崩して書きやすさをとっているので、 dynamic に限って暗黙の型変換を許すのは良いバランスじゃないかということです。
1:41 AM
↓のように書きたい。 import Python let np = Python.import("numpy") let a = np.array([[1, 2], [3, 4]]) let b = np.array([[5], [6]]) let c = np.matmul(a, b) let d: Int = c[0, 0] // 暗黙の型変換 print(d)
1:42 AM
Int を右に書くか左に書くかの違いに見えますが、引数に渡すときに意味があります。
1:43 AM
↓みたいな感じ。 @dynamicMemberLookup @dynamicCallable @dynamicConvertible struct PythonObject { ... func converted() -> Int { ... } func converted() -> Bool { ... } func converted() -> String { ... } func converted() -> (PythonObject, PythobObject) { ... } ... } (edited)
1:44 AM
今は IntBool 等については extensioninit になってるけど、タプルは extension 作れないので PythonObjecttuple2 とかのメソッドが生えてて統一感もない。