Shedskin - 编译错误

时间:2013-01-08 00:35:26

标签: c++ python converter shedskin

我目前正在尝试使用shedskin编译一个python项目(5个文件@总共1200行代码)。

我尝试使用shedskin版本0.9.3和0.9.2都会导致相同的错误。 这是我遇到的第一个错误:

mmain.cpp: In function ‘__shedskin__::list<__shedskin__::list<int>*>* __mmain__::list_comp_3(__shedskin__::__ss_int)’:
mmain.cpp:133: error: no matching function for call to ‘__shedskin__::list<__shedskin__::list<int>*>::append(__shedskin__::list<double>*)’

此外,我在运行流苏(即在输入“make”之前)之后,我收到许多警告 - 所有警告都与动态类型有关:

*WARNING* mmain.py: expression has dynamic (sub)type: {float, int, list}

然而,使用提供的示例,shedskin似乎完美无缺,因为我可以编译并执行它们而没有任何错误。

您是否知道在何处查找错误或与错误相关的内容?

2 个答案:

答案 0 :(得分:1)

mmain.cpp:133: error: no matching function for call to ‘__shedskin__::list<__shedskin__::list<int>*>::append(__shedskin__::list<double>*)’

此错误意味着您有一个shedskin推断为list listint的Python对象,但现在您正在尝试附加一些推断为list float的内容。例如,您可以通过以下方式获得:

a = [[1], [2]]
b = 1.0
a.append([b])

但是,从上面一行开始,函数名称为list_comp_3。除非你实际上命名了一个函数list_comp_3(你还没有),这是一个列表理解。所以,你可能会做这样的事情:

a = [1, 2, 3.0]
b = [[i] for i in a]

您可能想知道为什么它会让您逃脱a但却失败了b。好吧,首先,它可能并没有真正让你逃脱它,如果你有几十个你没有处理过的警告。但其次,正如文档所说:

  

整数和浮点数通常可以混合,但最好尽可能避免这种情况,因为它可能会混淆Shed Skin:

     

a = [1.0]

     

a = 1#错误 - 在这里使用浮点数

至于警告,它们可能意味着“你这次离开它,但不要指望总是这样做”到“与此相关的错误”到“这将编译,但是对于比原始Python代码效率低的东西,而不是更多“to”这将编译,但对于不正确的东西“。

更一般地说,听起来你的程序不能通过shedskin的推理引擎静态输入。如果没有真正看到你的代码,就不可能告诉你你做错了什么,但是如果你重新阅读the docs的键入限制和Python子集限制部分,这应该会让你了解什么是并且不合适。

答案 1 :(得分:1)

为了避免混淆,请注意'abartert'提供的两个代码片段在单独编译时编译并运行正常(shedskin 0.9.3)。我的猜测也是在解决动态类型警告后问题应该消失。如果没有,我会非常有兴趣看到你想要编译的程序,或者至少足以重现问题。

更新:顺便说一句,从0.9.1左右开始,流行皮肤应该更聪明地进行int和float混合。如果遇到会导致破解或效率低下的c ++代码的事情(由于必要的运行时转换),现在通常应该抱怨“不兼容的类型”警告。所以也许是时候为0.9.3略微更新这部分文档了。