@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 とかのメソッドが生えてて統一感もない。