Python


Какова вероятность выкинуть шестью кубиками шесть разных чисел, если ты можешь перебрасывать любое количество не понравившихся тебе кубиков не более двух раз? (это наш мальчик вытянул себе сложную карточку в King of Tokyo).
Очень быстро мы потеряли всех остальных игроков, написали Монте-Карло, а потом и аналитическую формулу, после чего перешли к сравнительным характеристикам языков программирования. Ещё через 15 минут я понял, что хочу выучить %subj%. Благо под него есть PyGame — проект, издалека похожий на то, что я недавно искал. Я уже успел набросать первое приближение на Splendor, но в процессе появилось куча мелких вопросов.
Никто из присутствующих не использует python в повседневной жизни, и не мог бы мне ответить на пару вопросов о best practices?
— Какой IDE использовать? Я накачал какое-то количество, мне не нравится ни один. Мне однозначно нужна возможность step-by-step debugging с простым просмотром переменных в момент остановки, а в идеале ещё и с консолью, откуда я мог бы интерактивно запускать какие-то команды с имеющимися переменными. Всё остальное мне казалось везде имеющимися деталями, но нет. Половина редакторов не нумерует строки, например. А ещё в одном я не нашёл, как запустить написанный код.
— Как вообще строятся проекты? Я привык к «один класс / функция / скрипт — один файл», но все примеры, которые я скачиваю, смешивают всё в самых разных пропорциях. И их можно понять — если у меня класс MyClass в том же файле, что и вызывающий его код, то вызов его идёт просто как MyClass. А если он в своём файле myClass.py, то мало того, что в начале вызывающего кода нужно написать import myClass, так ещё и указывать это при вызове: myClass.MyClass. В той же java всё было достаточно просто — в отсутствии конфликта, всё, указанное в import, как бы попадает в текущий namespace, и никакое уточнение уже не требуется. Не говоря уже о том, что все классы одного package по умолчанию видят друг друга.
— Как организовывать константы? Например, у меня есть размеры экрана, размер карты, расстояние между рядами карт и т.п. (используется как для отрисовки, так и для определения, куда пользователь ткнул мышью). Я бы с удовольствием засунул в класс статические структуры констант, чтобы получить вызов типа Constants.SCREEN.WIDTH (а то и в глобально видимую константную структуру, чтобы избежать имени класса). Но мало того, что в питоне нет простого варианта для константы (в принципе, меня это не сильно смущает, я могу проконтролировать, что я не меняю значения собственных констант), я не нашёл простого варианта определения структуры. Либо какие-то многострочные определения namedtuple, либо каждая структура — как класс без кода (в принципе было бы терпимо, если бы не синтаксис обращения к классу — см. выше).
— Есть ли какие-то «векторные» операторы? Например, у меня есть список координат X, и мне нужно понять, какому интервалу соответствует координата x. В каком-нибудь MatLab я написал бы find(x > X(1 : end — 1) && x <= X(2 : end)), чтобы получить номер нужного мне интервала, а здесь?

А так, конечно, пока что очень приятный язык. Практически на любой вопрос google сразу находит внятные ответы, уже разобранные возможные варианты и уже написанные библиотеки. Невольно вспоминаешь недавний анекдот с bash.org, заканчивающийся фразой: «Это как играть в JS-пей. Вбиваешь в гугл рандомное слово с припиской JS. Если такой библиотеки нет — пьёшь.» Я бы правда играл наоборот — если не сумел найти название ещё не написанной библиотеки.