我正在编写一个将同时翻译为Python和C#的类。
我的代码使用漂亮的“glm”库。Glm提供了有用的数据类型,例如:Vec3
我能让类中的Python和C用户看到Vec3吗?
换句话说,我可以使用Vec3数据类型公开公共方法吗?
下面是一个Haxe代码示例,其中的类的公共函数使用Vec3类型:

// Test execution:
// haxe -main TestGLM1 -lib glm --interp
// Translate into Python:
// haxe -main TestGLM1 -python TestGLM1.py  -lib glm
// python3 TestGLM1.py

import glm.Vec3;
import glm.Quat;
import glm.Mat4;


class TestGLM1 {

    public function new() {
    }

    static function main() {

        // My test of the method taking 3D datatypes as input and output
        var t: TestGLM1 = new TestGLM1() ;
        var v1: Vec3 = new Vec3(1,2,3) ;
        var v2: Vec3 = new Vec3(7,8,9) ;
        t.testVecIO(v1, v2);

        trace(v1, v2);
    }

    public function testVecIO(vec_in: Vec3 , vec_out: Vec3) {
        vec_out.x = vec_in.x + vec_out.x;
        vec_out.y = vec_in.y + vec_out.y;
        vec_out.z = vec_in.z + vec_out.z;
    }
}

我想编写一个这样的Python测试:
from TestGLM1 import TestGLM1
from TestGLM1 import glm_Vec3

print("Python Test...")

t = TestGLM1()

v1 = glm_Vec3(1,2,3)  # Vec3()
v2 = glm_Vec3(4,5,6)  # Vec3()
t.testVecIO(v1, v2)
print(v1, v2)

print("Python done.")

但是,此测试失败:
importorror:无法导入名称“glm_Vec3”
因为我能在TestGLM1.py中看到的唯一类是:
class glm_Vec3Base:
    _hx_class_name = "glm.Vec3Base"
    __slots__ = ("x", "y", "z")
    _hx_fields = ["x", "y", "z"]

    def __init__(self):
        self.z = None
        self.y = None
        self.x = None

它既有一个不友好的名称,又没有显示正确的构造函数。
有什么建议吗?
谢谢。

最佳答案

我在TestGLM1.py中看到的惟一类是glm_Vec3Base
这是因为Vec3是一个AA>,抽象只存在于编译时。底层类型实际上是一个名为abstract的类,如果您选中Vec3Base,您将注意到它“没有正确的构造函数”的原因:

class Vec3Base {
    function new() {}

    var x:Float;
    var y:Float;
    var z:Float;
}

您还可以注意到,所有的Vec3.hx方法都声明为Vec3。如果不是这样(您可以通过使用inline编译来强制这样做),那么Python输出将有一个名为--no-inline的附加类。它对所有glm__Vec3_Vec3_Impl_的方法都有静态方法,因为抽象就是这样在幕后工作的:
在这一点上,一个好问题是“如果一个成员函数没有内联声明会发生什么”,因为代码显然必须去某个地方。Haxe创建一个私有类,称为实现类,它将所有抽象成员函数作为静态函数,接受底层类型的附加第一个参数Vec3
总之,由于this是作为一个抽象实现的,所以我认为没有一种方便的方式将其公开给Python或C用户。Haxe生成的代码通常不太适合这样使用。这并不是说根本没有任何机制来促进这一进程。例如,JavaScript和Lua目标有Vec3 type元数据。

关于python - 如何与我的类一起公开从glm Haxe lib导入的类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48669998/

10-09 13:51