![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Были в гостях у
catpad, заигрались в настолки, начали рассуждать о вероятностях, очнулись за компьютером.
Какова вероятность выкинуть шестью кубиками шесть разных чисел, если ты можешь перебрасывать любое количество не понравившихся тебе кубиков не более двух раз? (это наш мальчик вытянул себе сложную карточку в 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)), чтобы получить номер нужного мне интервала, а здесь?
catpad показал мне, конечно, map и reduce, но они выглядят как пушки для воробьёв (ну или я просто ещё не вкурил красоту их использования).
А так, конечно, пока что очень приятный язык. Практически на любой вопрос google сразу находит внятные ответы, уже разобранные возможные варианты и уже написанные библиотеки. Невольно вспоминаешь недавний анекдот с bash.org, заканчивающийся фразой: «Это как играть в JS-пей. Вбиваешь в гугл рандомное слово с припиской JS. Если такой библиотеки нет — пьёшь.» Я бы правда играл наоборот — если не сумел найти название ещё не написанной библиотеки.
Update 11/05/2017. Bash.org. Цитата №444797
Комментарий к статье с подборкой плагинов для текстового редактора Sublime Text:
zzz: я использую vim, просто потому что не могу из него выйти, чтобы посмотреть, что такое sublime text...
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
Какова вероятность выкинуть шестью кубиками шесть разных чисел, если ты можешь перебрасывать любое количество не понравившихся тебе кубиков не более двух раз? (это наш мальчик вытянул себе сложную карточку в 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)), чтобы получить номер нужного мне интервала, а здесь?
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
А так, конечно, пока что очень приятный язык. Практически на любой вопрос google сразу находит внятные ответы, уже разобранные возможные варианты и уже написанные библиотеки. Невольно вспоминаешь недавний анекдот с bash.org, заканчивающийся фразой: «Это как играть в JS-пей. Вбиваешь в гугл рандомное слово с припиской JS. Если такой библиотеки нет — пьёшь.» Я бы правда играл наоборот — если не сумел найти название ещё не написанной библиотеки.
Update 11/05/2017. Bash.org. Цитата №444797
Комментарий к статье с подборкой плагинов для текстового редактора Sublime Text:
zzz: я использую vim, просто потому что не могу из него выйти, чтобы посмотреть, что такое sublime text...
no subject
Date: 2017-04-13 10:47 pm (UTC)Но я скорее советую освоить ipython - это источник счастья
Кроме того надеюсь тебе про pip уже все рассказали
2 Структура питон проекта http://python-guide-pt-br.readthedocs.io/en/latest/writing/structure/ https://packaging.python.org/distributing/#configuring-your-project
Если сделаешь как написано, скажешь потом себе спасибо не один раз
3 Константы можешь закинуть в модуль
consts.py
потом:
но я бы сделал скорее через словарь + addict + файл настроек в формате yaml
file settings.yaml
example:
4 В питоне есть ооооочень строгие правила наименования всего и вся. погугли Python + PEP8 для начала - а потом можешь до гугловских стандартов подтянуться
Векторныe операции есть в numpy
Вот тут для таких как ты есть шпаргалка
Приглашай в гости на выхах, попрограмируем.
Советую сразу github осваивать - тебе понравится.
no subject
Date: 2017-04-14 08:34 am (UTC)ipython посмотрю, но если вдруг ты можешь добавить, почему там счастье, мне будет проще :-)
3. Супер, спасибо!
no subject
Date: 2017-04-14 08:05 pm (UTC)Конвенции имён у меня пока что "свои", джавовские. Может быть когда-нибудь перейду на питоньи, но пока что мне больно даже смотреть на searchsorted без заглавного S...
А с константами - мне всё равно не нравится. Вот если бы принцип как в первом твоём примере, а синтаксис - как во втором. То есть, определить константы где-то в отдельном файле, но чтобы они были сгруппированы по структурам. И в результате писать:
from consts import *
print(SCREEN.WIDTH)
print(SCREEN.HEIGHT)
Как это можно нормально сделать?
no subject
Date: 2017-04-14 09:56 pm (UTC)Чтобы сделать что ты хочешь можно так
Consts.py
Библиотека addict просто добавляет синтаксический сахар к питоновским стандартным диктам позволяя доступ к значениям словаря через точку dict.key а не dict ['key'].
Можно ещё использовать чёрную магию и проапдетить globals() динамически если уж очень хочется.
Имхо сеттинги должны жить вне кода, в файле настроек, в идеале в yaml а константы должны быть немногочисленны и просты. SCREEN.WIDTH противоречит сразу нескольким правилам pep8 conf.screen.heigth более кошерен, SCREEN_WIDTH тоже.
no subject
Date: 2017-04-15 10:01 am (UTC)А по всему остальному - ты, видимо, принимаешь меня за кого-то другого, кто уже проработал с питоном годы, и кому твои короткие фразы о чём-то говорят. Мне они только намекают, в лучшем случае. напоминаю: я увидел первую строчку на питоне на прошлой неделе :-)
no subject
Date: 2017-04-15 08:05 pm (UTC)В питоне к членам класса обращение через изнутри - self.width и снаружи screen.width недвусмысленно будет определять твой атрибут для тебя и всех кому он может понадобится.
Может сейчас ещё рано, но у тебя скоро будут объекты : карта, дека, игровой стол и их параметры скорее всего пойдут туда.
no subject
Date: 2017-04-14 10:01 pm (UTC)Кстати нейминг функций в numpy не совсем кошерен. Они должны были использовать snake_case. но многие ранние библиотеки этим страдают.