Было плохо, стало плохо. Но с интерфейсами и инверсией зависимостей.
Можно ли сказать что метод который читает данные из провайдера и проводит вычисления следует принципу единой ответственности?
В данном случае напрашивается чистая функция которая отвечает за вычисления. Она принимает два аргумента (координаты и смещение) и возвращает результат.
Писать тесты к таким функциям одно удовольствие. Ведь у неё нет зависимости и сайдэфектов. И моков никаких не надо.
Клас с бизнес логикой будет простым как пробка. Взять из сети координаты, передать их в вычисление. Тут без моков не протестить. Но и тестить то особо нечего: тест на позитивный сценарий и пара тестов на обработку ошибок. Тут будет прямо как в статье «Юнит-тесты зависят от подробностей реализации». Если функция имеет сайдэфекты, то их надо тестировать.
У нас есть a и b. Для их чтения используются разные инструкции (LOAD_FAST, LOAD_GLOBAL).
При построении байткода если есть локальная переменная, все обращения к ней локальны (LOAD_FAST), вне зависимости от порядка их следования.
flake8 — это не совсем анализатор, это обёртка над анализаторами. А еще его можно расширять плагинами. Если сравнивать flake8 с плагинами с голым pylint, то новых ошибок будет меньше.
В свое время выбрал flake8 за возможность точной настройки отключения проверок. Была огромная кодовая база и расставлять комментарии на файлы и строчки не хотелось. Я просто прошёлся по отчету ошибок и отключил конкретные проверки в конкретных файлах. Это позволило быстро сконфигурировать CI и не давать этой заразе расползаться.
А вот пример из проекта на Джанго: никаких ложных срабатываний на отсутствие докстрингов нет.
пункт 16(enumerate + распаковка в for) и 13(enumerate(iterable)) очень близки по смыслу, да и 12й(unpack to variable) рядом.
19 Декораторы способ принять функцию в виде аргумента и вернуть функцию
21 А вы знаете что в питоне есть функции высшего порядка, которые позволяют принимать функцию в виде аргумента?
8(создание класса через type) Еще collections.namedtuple, который очень часто в стандартных библиотеках используется для создания нового класса.
Онлайн проверки и badges & levels это все пустяки и не очень важно. А важно то, что можно посмотреть множество вариантов решения этой задачи другими людьми, это интересно и полезно.
Причем я уверен, что гуру питона наверняка найдут ещё кучу возможностей для оптимизации. Но зачем? Всё работает, код достаточно прост и лаконичен. Прям глаз радуется.
Это молодость, это пройдет. :)
def saveWrap(dir='.', letter='A', font=«Arial», size=40, align=Qt.AlignCenter):
png_file = dir + "/" + font + "_" + letter + "_" + str(size) + ".png"
save(png_file, letter, font, size, align)
Перед публикацией вычитывайте код. Коментированные строки излишни.
print («img.load({0}) failed!».format(png_file))
Вначале подумал что атавизм из второго питона. Потому что данная строка будет там работать точно так же. Если ставите пробел между принтом и вызовом то ставьте его везде.
Это придумали консультанты чтобы свои услуги продавать!
А еще к линтеру нужен автоматический-запускатель. Я использую pre-commit локально и github actions на гитхабе.
Под свои предпочтения собрал шаблон проекта с плагинами.
github.com/Cjkjvfnby/project_template/tree/master/%7B%7Bcookiecutter.folder_name%7D%7D
Можно ли сказать что метод который читает данные из провайдера и проводит вычисления следует принципу единой ответственности?
В данном случае напрашивается чистая функция которая отвечает за вычисления. Она принимает два аргумента (координаты и смещение) и возвращает результат.
Писать тесты к таким функциям одно удовольствие. Ведь у неё нет зависимости и сайдэфектов. И моков никаких не надо.
Клас с бизнес логикой будет простым как пробка. Взять из сети координаты, передать их в вычисление. Тут без моков не протестить. Но и тестить то особо нечего: тест на позитивный сценарий и пара тестов на обработку ошибок. Тут будет прямо как в статье «Юнит-тесты зависят от подробностей реализации». Если функция имеет сайдэфекты, то их надо тестировать.
6 0 LOAD_GLOBAL 0 (print)
2 LOAD_GLOBAL 1 (b)
4 CALL_FUNCTION 1
6 POP_TOP
7 8 LOAD_GLOBAL 0 (print)
10 LOAD_FAST 0 (a)
12 CALL_FUNCTION 1
14 POP_TOP
8 16 LOAD_FAST 0 (a)
18 LOAD_CONST 1 (10)
20 INPLACE_ADD
22 STORE_FAST 0 (a)
24 LOAD_CONST 0 (None)
26 RETURN_VALUE
У нас есть a и b. Для их чтения используются разные инструкции (LOAD_FAST, LOAD_GLOBAL).
При построении байткода если есть локальная переменная, все обращения к ней локальны (LOAD_FAST), вне зависимости от порядка их следования.
В свое время выбрал flake8 за возможность точной настройки отключения проверок. Была огромная кодовая база и расставлять комментарии на файлы и строчки не хотелось. Я просто прошёлся по отчету ошибок и отключил конкретные проверки в конкретных файлах. Это позволило быстро сконфигурировать CI и не давать этой заразе расползаться.
А вот пример из проекта на Джанго: никаких ложных срабатываний на отсутствие докстрингов нет.
per-file-ignores =
*/tests/*:D102,D103,S101
*/manage.py:D103,C812
*/settings/*:F401,F403,F40
Если поставить на паузу и идти по шагам, там будет коротки пояснительный текст.
пункт 16(enumerate + распаковка в for) и 13(enumerate(iterable)) очень близки по смыслу, да и 12й(unpack to variable) рядом.
19 Декораторы способ принять функцию в виде аргумента и вернуть функцию
21 А вы знаете что в питоне есть функции высшего порядка, которые позволяют принимать функцию в виде аргумента?
8(создание класса через type) Еще collections.namedtuple, который очень часто в стандартных библиотеках используется для создания нового класса.
Pillow >= 2.0.0 supports Python versions: 2.6, 2.7, 3.2, 3.3;
pypi.python.org/pypi/Pillow/2.0.0
Это молодость, это пройдет. :)
имя в нестандартной нотации. www.python.org/dev/peps/pep-0008/#method-names-and-instance-variables
Складывание кучи строк некрасиво. docs.python.org/3.3/library/string.html?highlight=string#format-examples
Функция совсем не нужна. Можно всю логику перенести в save
Перед публикацией вычитывайте код. Коментированные строки излишни.
Вначале подумал что атавизм из второго питона. Потому что данная строка будет там работать точно так же. Если ставите пробел между принтом и вызовом то ставьте его везде.
Попробуйте без слэша.
Гляньте глоб docs.python.org/3.3/library/glob.html?highlight=glob.glob#glob.glob
Спасибо за библиотеку работы с картинками, а то PIL у меня под 7-64 заводится с бубнами.