Pull to refresh

Comments 27

UFO just landed and posted this here
По количеству буковок выигрывают K и прочие APL-подобные языки, типа J. ;)
Заголовок спойлера
всегда

Остановились на середине. setup.py, requirements.txt, entry points.

Какой же FizzBuzz без travis.yml и прочего continuous integration/deployment…

ci/cd — это уже delivery pipeline, а setup.py — то, как его ставить. Даже если ci/cd нет, процедура установки всё равно какая-то должна быть. И scp ~developer/git/mywork/foobar.py root@production:/var/www/production/, это явно не то, что хочется видеть в продакшене. Даже если это пятистрочный питон.

Хотел пошутить насчёт egg-packages и pypi, но потом решил проверить:


> pip search fizzbuzz

PyFizzBuzz (0.0.3)        - FizzBuzz cli tool
fizzbuzzy (0.0.1)         - Python package which prints Fizz, Buzz, FizzBuzz divisible by 3 and 5 and both

Хотя до enterpise edition ещё далеко...

Подход конечно интересный, но всё же слишком чрезмерный на данном примере. Превращать код на 10 строк в код на 160. 16-кратное (ну не совсем 16-кратное, некоторые строки это отступы для красоты, но всё таки) увеличение!!! Да безусловно, в нём появилось много интересных фич, но вопрос а стоило ли оно того? Ведь не все скрипты пишутся «на века».
Иными словами несмотря на довольно занимательную идею пример прям активно демонстрирует позицию тех кто сравнил этот метод с «пальбой из пушки по воробьям»
Пример на то и пример чтобы сконцентрироваться на сути статьи. Есть ли смысл в качестве примера брать реальный скрипт на сотни строк?
Не знаю много ли примеров одноразовых скриптов на сотни строк, у меня они все меньше 100, а все что больше — уже не одноразовое. Городить для действительно одноразовых то что описано в статье — мягко говоря, перебор.

Так там ёлочки не от балды стоят.

Да, этот «тест» правда хорош. Он позволяет оценить не только наличие базовых навыков программирования, но и, что отлично видно в этом примере, подход человека к решению задачи. Сразу видно, умеешь ты читать и выполнять задачу или начинаешь придумывать отсебятину, за которую денег никто не платил.
Вот исходный код Python-скрипта, который позволяет решить задачу
И по идее, после кода должен быть конец.

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

Переводчику я должен заметить, что у источника в заголовке слово «sustainable», которое я бы в данном контексте перевёл не как «надежный», или «прочный», а скорее — «долговечный». Тогда все вроде становится на свои места. Ведь, если мы увеличили сложность всего решения, а она очевидно возрасла в разы, то надежность будет неминуемо падать. Простое перемножение вероятностей. Так что, нельзя с уверенностью утверждать, что мы увеличили надежность скрипта, несмотря на то, что все описаное и является «хорошим тоном» в программировании. А вот «долговечность» такого кода увеличивается.

если мы увеличили сложность всего решения, а она очевидно возрасла в разы, то надежность будет неминуемо падать. Простое перемножение вероятностей. Так что, нельзя с уверенностью утверждать, что мы увеличили надежность скрипта

Если добавили своего кода, то да, если использовали готовые надежные модули, то сложность растет уже не так катастрофически.

Я говорю про увеличение количества точек отказа. Независимо от надежности используемых компонент.
А так, конечно, если использовать мейнстримовые библиотеки то они будут, скорее всего, надежнее, чем какое-то нишевое решение или самопал.

Добавить проверку аргументов командной строки: fizz != buzz, оба не равны 0, start <= end + 1

Многие свойства click — не самая лучшая идея для приложения, которое нужно хорошо протестировать, хоть и хороша для очень маленьких демо-проектов, помещающихся в одном файле.


То, с чем столкнулся я и почему перестал использовать:


  • "положим всё в декораторы!" — хорошо, но очень много магии и труднее протестировать. Разделяй реализацию метода и вызов.
  • порядок аргументов очень важен, click позволяет только сортированный
     * antipattern "магическое состояние, которое хранится в каком-нибудь одном модуле". Его нет в aiohttp и других asyncio фреймворках (из request можно достать app, в котором можно что-то сохранить, если нужно). "explicit is better than implicit"
    • argparse можно найти обычно в одном из модулей, если необходимо, некоторые проекты документируют
    • читать docstring, на который нет стандарта в поисках документации… часть он угадает, часть — нет (explicit is better than implicit)
    • Monkey-patching для вывода ошибок? нет, спасибо. Это последнее, что нужно в Python. Если вы пришли из Ruby, пожалуйста, научитесь писать нормально.

Например


Python 3.7.2 (default, Feb 19 2019, 13:23:50)
Type "help", "copyright", "credits" or "license" for more information.
>>> import click
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'click'
>>>

Вы написали логгер и аргпарс руками хотя могли бы использовать docopt и loguru и код увеличился бы едва ли на десять строк.

Не pep-8, очевидно, но python way

Взаимоисключающие параграфы?
Отнюдь. Например, PEP-8 ограничивает максимальную длину строки. Python way ею не заморачивается, потому что это вопросы оформления.
Поговорим о том, как его улучшить.
может просто применить решето Эратосфена заместо трёх проверок числа на каждое значение

А зачем вам простые числа?

ну он каждый раз проверяе делится ли число на 3 5 или 15 так лучше бы сразу генерировать

Вычислять до какого предела? А если чиселка с внешнего пайплайна пришла? Какой-нибудь деревянный вариант балансира, который по облачному id определяет на какой из трех серваков подать нагрузку. Решета нужны когда есть шанс переиспользоваться в одном запуске, и в случае fizzbuzz оно точно не эратосфеново

Sign up to leave a comment.