3

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

您是否知道在哪里查找错误或错误与什么有关?

4

2 回答 2

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

此错误意味着您有一个 Python 对象,该对象shedskin已推断为 a listof lists of ints,但现在您尝试附加一些推断为 a listof floats 的内容。例如,您可以这样做:

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 代码更高效而不是更多”到“这将编译,但出现不正确的地方”。

更一般地说,听起来你的程序不能由 shedskin 的推理引擎静态输入。如果没有真正看到您的代码,就不可能告诉您您做错了什么,但是如果您重新阅读文档的 Typing Restrictions 和 Python Subset Restrictions 部分,那应该会让您了解事物的种类和种类。合适。

于 2013-01-08T02:06:46.743 回答
1

为避免混淆,请注意 'abartert' 提供的两个代码片段在单独编译时都能正常编译和运行(shedskin 0.9.3)。我的猜测也是,在解决动态输入警告后问题应该会消失。如果没有,我会非常有兴趣查看您尝试编译的程序,或者至少有足够的程序来重现问题。

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

于 2013-01-08T07:06:19.967 回答