- dev,
- it,
- извращения
Призовая игра с встраиванием питона
Я не возьмусь определять что мне более отвратительно libboost или python. Но право скажу собранные вместе в boost::python они производят на свет субстанцию непревзойденного свойства.
#include <boost/python.hpp> #include <stdio.h> int main() { Py_InitializeEx(0); boost::python::object modMath = boost::python::import("math"); boost::python::object cosFunc = modMath.attr("cos"); Py_Finalize(); }
С 2.7м питоном работает нормально, с третьем падает с невнятной ошибкой при отработке хуков при выходе...
Историю с локализацией места проблемы в портируемой программе с последующим вынесением в приведенный standalone, я опущу из-за малосодержательности и нецензурности... Скажу только, что gdb плюс правильно выбранные места для breakpoint'ов рулят.
Далее в процессе плясок вокруг этого примера вдруг обнаруживаю что вот так не падает:
int main() { Py_InitializeEx(0); { boost::python::object modMath = boost::python::import("math"); boost::python::object cosFunc = modMath.attr("cos"); } Py_Finalize(); }
Ага! думаю я. Оно позвало деструктор до финалайза а не после и все перестало падать... Надо сделать так же!
Но вот проблема... аналог переменной cosFunc в портируемой программе глобальная... Создается пустая, а потом после инициалайза заполняется. Можно было бы раскинуть мозгами, как запихнуть туда указатель вместо самого объекта, и сказать ему в нужный момент delete. Но менять весь остальной код очень не хотелось...
А нельзя ли так, чтобы для сложного объекта вызвался деструктор а сам объект опять заполнить пустым значением?
Оказывается можно:
int main() { Py_InitializeEx(0); boost::python::object cosFunc; { boost::python::object modMath = boost::python::import("math"); cosFunc = modMath.attr("cos"); } cosFunc = boost::python::object(); Py_Finalize(); }
оно заменяет сложное значение cosFunc
тривиальным, при этом для заменяемого значения вызывается деструктор.
И вот так -- тоже не падает...
P.S. Отдельно доставила рекомендация документации на 1.55 boost::python просто не вызывать Py_Finalize()
, типа не надо вам это.
P.P.S. Пришел к мысли что сам питон не падает только потому что и так ползает. And you should not boost it.
P.P.P.S. Честно говоря не верил, что осилю с этим разобраться. Без знания, что буста, что питона... Ан нет, получилось...
no subject
Сам питон не падает, потому что не на плюсах написан.
Но вообще, если подумать, в переходе от 2-го питона к 3-му есть что-то общее с переходом от C к C++.
А в Tcl вообще этот переход замаскировали внутри минорно версии - от 8.0 к 8.1.
no subject
Ну и кто ж тебе доктор не знать питона. Не любить его ты имеешь право, но не знать-то зачем? Я вот windows не люблю, однако ж Рихтера прочитал. И C++ не люблю, а труп страуса прорабатывал аж дважды - 2-е издание и 4-е.
no subject
Во-первых, программирование для меня во многом про удовольствие. Поэтому неприятных вещей я предпочитаю избегать. Есть люди которым это нравится, есть люди которым все равно. Вот пусть они эти вещи вместо меня делают.
Я понимаю что большой, приносящий большое удовольствие результат, может быть достижим только через неприятные области, и тогда приходится идти на копмпромис (как в случае с указанным выше примером). Но история с виндоус показала, что стратегия "извините, я этого не умею" работает прекрасно. И можно просто неприятные вещи не делать.
Во-вторых, программирование для меня это про философию и про "парвильно/неправильно". И если я вижу неправильные вещи, мне становиться физически неприятно. Если я могу, то я их исправляю. Если нет, то см. п.1.
no subject
Когда я занимался спортивным ориентированием, меня учили читать карту на два сантиметра вправо и влево от маршрута. Для того чтобы попасть туда, куда хочется нужно представлять свой путь в контексте окружающего ландшафта.
Особенно если программирование для тебя про философию, знать типичные когнитивные ловушки. в которые попадаются люди, занимающиеся этим - надо.
Тут как раз windows является такой типичной когнитивной ловушкой.
С питоном как с экосистемой еще интереснее. Там у истоков стояли люди с вполне нормальным философским взглядом на мир, тот же Гвидо. Но потом понабежали как раз люди, испорченный неправильным ООП Java и Windows.
no subject
Тут важно еще в эту ловушку не попасться. Я знаю что я слаб духом, и если несколько раз попробую неправильное, но удобное, то конформист очень быстро победит... Проверено на различных не критичных областях. Поэтому в критичных областях -- ни капли в рот... Как бы экстравагантно это не смотрелось со стороны...
Поэтому ловушки я предпочитаю рассматривать со стороны, и опрашивать тех кто там уже был.
Было бы интересно услышать твои суждения на этот счет...
У меня реакция на питон строго рефлекторная... Поэтому приходится этот рефлекс реверс-инженерить и анализировать.
В первом цикле анализа вылазит "синтаксически значимое количество пробелов -- фу-фу-фу". Под этой реакцией есть определенное рациональное зерно. Они в угоду чему-то отказались от устоявшегося элемента инженерной традиции. При этом это что-то похоже имеет не инженерный характер. Судя по всему скорее маркетинговый "людям так не удобно". И хрен бы с ними, с пробелами, и не такое переживали, но сам подход отказа от инженерной части в пользу маркетинга, я полагаю порочным, даже при условии суммарной успешности. Кто знает от чего они там еще отказались или откажутся в будущем.
Второй цикл, по примерно тому же самому месту, принес следующее: по словам одного коллеги питон вообще разрабатывался как язык для непрофессионалов. Я помню еще один такой же мега-популярный язык для непрофесионалов, это php. К счастью я все реже про него слышу. С php вообще грустно, потому что он еще и стихийно развивался, за ним вообще никакой концепции не стояло, кроме "а давайте сайт по быстрому сделаем". В питоне хотя бы была серьезная работа с самого начала... Так что понабежавшие туда люди это следствие дизайна их привлекающего. Если условно, они не воспитывали разработчиков, а подстраивались под их слабости...
Правильным тут было бы бы разделять: во это -- для мужчин, а это -- ледоруб. И не путать. Вообще наверное это хорошо, что программированием мог заниматься каждый, но до достижения определенного уровня пусть бы этим занимались в своей песочнице, не увеличивая ее размер до размера всей отрасли... Сейчас на заявление о том что ты знаешь php, я полагаю посмотрят снисходительный но и улыбнуться, как если бы ты заявил что ты опытный пользователь MS Word. Очень надеюсь что питон ждет та же участь...
Третяя самая интересная: я в свое время выучил скриптовый язык под юникс-системы, актуальный на тот момент по моим представлениям. И вот теперь вдруг выясняется, что мои знания ничего не стоят и надо учить другой язык, потому-что все пишут на другом языке.
При этом надо с одной стороны все библиотеки переписывать на новый язык, а если я хочу остаться на старом то то, что уже написано на новом надо наоборот переносить на старый. Оно не переноситься автоматически.
С моей точки зрения это очень сильно фрагментирует сообщество. Проекты написанные на компилируемых языках друг с другом в целом линкуются. Если я напишу что-то, скажем на C++, то этими результатами смогут воспользоваться все, максимум написав обертки. Но если я выберу один из интерпретируемых языков, то пользователи других языков окажутся в пролете. Из-за извратных синтаксисов иные даже не смогут это нормально прочитать.
В правильную сторону двинулся perl6 ставший по дороге ракудой... Они вместе с языком создали байт-код машину в которую по идее могут компилироваться другие языки. Не знаю как у них все это дальше получится, но по серьезному связываться с новыми интерпретируемыми языками я бы стал бы только при условии что они компилируются в байткод существующих байт-код-машин. Вот на этом месте я бы даже питон ради святого дела выучил. Потому что переход к этой парадигме в наше время без наличия компилятора питона -- невозможен... Но мне пока до этого очень-очень-очень далеко...
Вот так это все выглядит..