我目前正在尝试用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>*)’此外,在运行shedskin之后(即在输入“make”之前),我收到了许多警告--所有这些都与动态类型有关:
*WARNING* mmain.py: expression has dynamic (sub)type: {float, int, list}然而,shedskin似乎可以完美地使用所提供的示例,因为我可以编译和执行它们而不会出现任何错误。
您是否知道在哪里查找错误,或者错误与什么相关?
发布于 2013-01-08 10:06:47
mmain.cpp:133: error: no matching function for call to ‘__shedskin__::list<__shedskin__::list<int>*>::append(__shedskin__::list<double>*)’这个错误意味着你已经得到了一个Python对象,shedskin已经推断它是ints的list of lists,但是现在你试图附加一些被推断为floats的list的东西。例如,你可以这样做:
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上却失败了。首先,如果你收到了几十个你没有处理过的警告,那么它可能并没有真正让你逃脱惩罚。但第二,正如文档所说:
整数和浮点数通常可以混合在一起,但最好避免这样做,因为它可能会混淆脱皮:
A= 1.0
A= 1 #错误-此处也使用浮点型
至于警告,它们可能意味着任何东西,从“你这次逃脱了,但不要指望总是这样做”,“与此相关的错误即将出现”,“这将被编译,但效率低于原始Python代码,而不是更多”,到“这将被编译,但不正确”。
更广泛地说,听起来你的程序就是不能被shedskin的推理引擎静态类型化。在没有实际看到代码的情况下,不可能告诉您哪里做错了,但是如果您重新阅读the docs的类型限制和Python子集限制部分,应该会让您了解哪些事情是适当的,哪些事情是不适当的。
发布于 2013-01-08 15:06:20
为了避免混淆,请注意'abartert‘提供的两个代码片段在单独编译时都可以很好地编译和运行(shedskin 0.9.3)。我的猜测也是,在解决了动态类型警告之后,这个问题应该会消失。如果没有,我将非常有兴趣看到您正在尝试编译的程序,或者至少有足够的程序来重现问题。
更新:顺便说一句,在0.9.1左右的版本中,shedskin在int和float混合方面应该更聪明一些。如果它遇到会导致c++代码损坏或低效的东西(因为需要进行排序的运行时转换),它现在通常会报错“类型不兼容”的警告。因此,也许是时候为0.9.3稍微更新一下这部分文档了。
https://stackoverflow.com/questions/14206513
复制相似问题