脱皮层 - 编译 E

2024-05-03 07:23:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正试图用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似乎可以完美地使用所提供的示例,因为我可以编译和执行它们而不会出现任何错误。在

你知道在哪里查找错误或者错误与什么相关吗?在


Tags: 项目代码in版本错误functionsscpp
2条回答
mmain.cpp:133: error: no matching function for call to ‘__shedskin__::list<__shedskin__::list<int>*>::append(__shedskin__::list<double>*)’

此错误意味着您得到了一个Python对象,shedskin已经推断为lists的list,但现在您试图附加一些它被推断为floats的list的东西。例如,可以通过以下操作获得:

^{pr2}$

但是,从上面一行来看,函数名是list_comp_3。除非您实际命名了一个函数list_comp_3(你没有),否则这是一个列表理解。所以,你可能会这样做:

^{3}$

您可能想知道为什么它让您逃脱了a,但在b上失败了。好吧,首先,它可能并没有让你逃脱惩罚,如果你有几十个警告你没有处理。但是第二,正如文件所说:

Integers and floats can often be mixed, but it is better to avoid this where possible, as it may confuse Shed Skin:

a = [1.0]

a = 1 # wrong - use a float here, too

至于警告,它们可以是任何含义,从“你这次侥幸逃脱了,但不要总是这样做”到“一个与此相关的错误正在出现”,到“这将编译,但比原始Python代码效率低而不是更高的东西”到“这将编译,但不正确的东西”。在

更一般地说,听起来你的程序不能被shedskin的推理机静态地类型化。如果没有实际看到代码,就不可能告诉您您做错了什么,但是如果您重新阅读the docs的类型限制和Python子集限制部分,您应该知道哪些类型的东西是合适的,哪些是不合适的。在

为了避免混淆,请注意“abartert”提供的两个代码片段在单独编译时都能正常编译和运行(shedskin0.9.3)。我的猜测是,在解决动态输入警告后,问题应该会消失。如果没有,我会很有兴趣看到你正在编译的程序,或者至少有足够的程序来重现这个问题。在

更新:顺便说一句,从0.9.1开始,shedskin应该对int和float混合更加聪明。如果它遇到了导致c++代码损坏或效率低下的问题(因为需要在运行时进行各种类型的转换),它现在通常应该抱怨“不兼容类型”警告。因此,也许是时候稍微更新一下0.9.3文档中的这一部分了。在

相关问题 更多 >