Shedskin — Ошибка компиляции

В настоящее время я пытаюсь скомпилировать проект Python (5 файлов при общем количестве 1200 строк кода) с помощью shedskin.

Я пробовал 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, кажется, работает безупречно с предоставленными примерами, так как я могу скомпилировать и выполнить их без каких-либо ошибок.

У вас есть идея, где искать ошибку или с чем связана ошибка?

3

Решение

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

Эта ошибка означает, что у вас есть объект Python, который shedskin предположил, как list из listс intс, но теперь вы пытаетесь добавить что-то, что это выводится как list из 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:

а = [1,0]

а = 1 # неправильно — здесь тоже использовать поплавок

Что касается предупреждений, они могут означать что угодно, от «у вас все получилось с этим на этот раз, но не ожидайте, что всегда будете делать это», до «возникает ошибка, связанная с этим« с », это скомпилируется, но с чем-то меньшим эффективнее, чем исходный код Python, а не «к», это скомпилирует, но к чему-то неверному ».

В целом, звучит так, что ваша программа просто не может быть статически напечатана механизмом вывода Шедскина. На самом деле не видя ваш код, невозможно сказать вам, что вы делаете неправильно, но если вы перечитаете разделы Ограничения набора и Ограничения подмножества Python документы, это должно дать вам представление о том, что это за вещи, а какие нет.

1

Другие решения

чтобы избежать путаницы, обратите внимание, что оба фрагмента кода, предоставленные «abartert», компилируются и работают нормально при компиляции отдельно (shedskin 0.9.3). Я также предполагаю, что проблема должна исчезнуть после разрешения предупреждений о динамической типизации. в противном случае мне было бы очень интересно увидеть программу, которую вы пытаетесь скомпилировать, или, по крайней мере, ее достаточно, чтобы воспроизвести проблему.

обновление: кстати, по состоянию на 0.9.1 или около того, шедскин должен быть умнее в смешивании int и float. если он сталкивается с чем-то, что может привести к поломке или неэффективному коду C ++ (из-за необходимого преобразования типов во время выполнения), теперь он обычно должен пожаловаться с предупреждением «несовместимые типы». так что, возможно, пришло время немного обновить эту часть документации для 0.9.3.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector