我目前正在尝试使用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似乎完美无缺,因为我可以编译并执行它们而没有任何错误。
您是否知道在何处查找错误或与错误相关的内容?
答案 0 :(得分:1)
mmain.cpp:133: error: no matching function for call to ‘__shedskin__::list<__shedskin__::list<int>*>::append(__shedskin__::list<double>*)’
此错误意味着您有一个shedskin
推断为list
list
个int
的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略微更新这部分文档了。