@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)
@dynamic
系は安全性を崩して書きやすさをとっているので、 dynamic に限って暗黙の型変換を許すのは良いバランスじゃないかということです。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)
Int
を右に書くか左に書くかの違いに見えますが、引数に渡すときに意味があります。@dynamicMemberLookup @dynamicCallable @dynamicConvertible struct PythonObject { ... func converted() -> Int { ... } func converted() -> Bool { ... } func converted() -> String { ... } func converted() -> (PythonObject, PythobObject) { ... } ... }
(edited)Int
や Bool
等については extension
の init
になってるけど、タプルは extension
作れないので PythonObject
に tuple2
とかのメソッドが生えてて統一感もない。