我目前正试图用shedskin编译一个python项目(5files@total1200行代码)。在
我尝试了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”之前),我收到许多警告-所有这些都与动态类型有关:
^{pr2}$然而,shedskin似乎可以完美地使用所提供的示例,因为我可以编译和执行它们而不会出现任何错误。在
你知道在哪里查找错误或者错误与什么相关吗?在
此错误意味着您得到了一个Python对象,
^{pr2}$shedskin
已经推断为list
s的list
,但现在您试图附加一些它被推断为float
s的list
的东西。例如,可以通过以下操作获得:但是,从上面一行来看,函数名是
^{3}$list_comp_3
。除非您实际命名了一个函数list_comp_3
(你没有),否则这是一个列表理解。所以,你可能会这样做:您可能想知道为什么它让您逃脱了
a
,但在b
上失败了。好吧,首先,它可能并没有让你逃脱惩罚,如果你有几十个警告你没有处理。但是第二,正如文件所说:至于警告,它们可以是任何含义,从“你这次侥幸逃脱了,但不要总是这样做”到“一个与此相关的错误正在出现”,到“这将编译,但比原始Python代码效率低而不是更高的东西”到“这将编译,但不正确的东西”。在
更一般地说,听起来你的程序不能被shedskin的推理机静态地类型化。如果没有实际看到代码,就不可能告诉您您做错了什么,但是如果您重新阅读the docs的类型限制和Python子集限制部分,您应该知道哪些类型的东西是合适的,哪些是不合适的。在
为了避免混淆,请注意“abartert”提供的两个代码片段在单独编译时都能正常编译和运行(shedskin0.9.3)。我的猜测是,在解决动态输入警告后,问题应该会消失。如果没有,我会很有兴趣看到你正在编译的程序,或者至少有足够的程序来重现这个问题。在
更新:顺便说一句,从0.9.1开始,shedskin应该对int和float混合更加聪明。如果它遇到了导致c++代码损坏或效率低下的问题(因为需要在运行时进行各种类型的转换),它现在通常应该抱怨“不兼容类型”警告。因此,也许是时候稍微更新一下0.9.3文档中的这一部分了。在
相关问题 更多 >
编程相关推荐