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

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

最佳答案

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

此错误意味着您有一个 Python 对象,shedskin 已将其推断为 list s 的 list s 的 int,但现在您正尝试附加一些它被推断为 list s 的 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 上失败。好吧,首先,如果您有数十个警告尚未处理,它可能并没有真正让您逃脱惩罚。但第二,正如文档所说:



至于警告,它们可能意味着任何事情,从“这次你逃脱了,但不要期望总是这样做”到“出现与此相关的错误”到“这将编译,但更少比原始 Python 代码更高效,而不是更多”到“这将编译,但会出现错误”。

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

关于c++ - Shedskin - 编译错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14206513/

10-13 08:33
查看更多