Pull to refresh
23
0.2
Send message
> «Чистая архитектура» и паттерны проектирования — тоже хипстерская хрень

Это придумали консультанты чтобы свои услуги продавать!
Тэги не для всех работают. В десктопной версии они расположенны сразу после заключения.
Линтеры хорошо, а линтеры с плагинами еще лучше. Пункты 7, 8, 10, 11 ими закрываются.

А еще к линтеру нужен автоматический-запускатель. Я использую pre-commit локально и github actions на гитхабе.

Под свои предпочтения собрал шаблон проекта с плагинами.

github.com/Cjkjvfnby/project_template/tree/master/%7B%7Bcookiecutter.folder_name%7D%7D
Многих не смущает, что он светиться предупреждениями как новогодняя ёлка.
И еще забыли «In the face of ambiguity, refuse the temptation to guess.» и отличную документацию.
Было плохо, стало плохо. Но с интерфейсами и инверсией зависимостей.
Можно ли сказать что метод который читает данные из провайдера и проводит вычисления следует принципу единой ответственности?

В данном случае напрашивается чистая функция которая отвечает за вычисления. Она принимает два аргумента (координаты и смещение) и возвращает результат.

Писать тесты к таким функциям одно удовольствие. Ведь у неё нет зависимости и сайдэфектов. И моков никаких не надо.

Клас с бизнес логикой будет простым как пробка. Взять из сети координаты, передать их в вычисление. Тут без моков не протестить. Но и тестить то особо нечего: тест на позитивный сценарий и пара тестов на обработку ошибок. Тут будет прямо как в статье «Юнит-тесты зависят от подробностей реализации». Если функция имеет сайдэфекты, то их надо тестировать.
Берём пример и смотрим на байткод.

import dis

a = 10
b = 20
def foo():
    print(b)
    print(a)
    a += 10

dis.dis(foo)


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 — это не совсем анализатор, это обёртка над анализаторами. А еще его можно расширять плагинами. Если сравнивать flake8 с плагинами с голым pylint, то новых ошибок будет меньше.

В свое время выбрал flake8 за возможность точной настройки отключения проверок. Была огромная кодовая база и расставлять комментарии на файлы и строчки не хотелось. Я просто прошёлся по отчету ошибок и отключил конкретные проверки в конкретных файлах. Это позволило быстро сконфигурировать CI и не давать этой заразе расползаться.

А вот пример из проекта на Джанго: никаких ложных срабатываний на отсутствие докстрингов нет.

per-file-ignores =
*/tests/*:D102,D103,S101
*/manage.py:D103,C812
*/settings/*:F401,F403,F40

Визуализация вставки и удаления: https://www.cs.usfca.edu/~galles/visualization/RedBlack.html

Если поставить на паузу и идти по шагам, там будет коротки пояснительный текст.
С питоном вечно так: пишешь код, а потом узнаешь что это уже есть в стандартной библиотеке :)
Сет стоит использовать потому, что это коллекция которая логически лучше подходит под использование (x in set).
Так бы и написал начинающий программист :)
Напишете пожалуйста до хабраката, что мероприятие в Москве.
К обмену переменных и распаковке в цикле я бы добавил такие примеры:
# 1.
a, (b, c) = c, (a, b)

# 2.
for x, (y, z) in enumerate(zip('ab', 'cd')):
    print(x, y, z)  # python 3

>>> 0 a c
>>> 1 b d

Очень хаотичное распределение.

пункт 16(enumerate + распаковка в for) и 13(enumerate(iterable)) очень близки по смыслу, да и 12й(unpack to variable) рядом.

19 Декораторы способ принять функцию в виде аргумента и вернуть функцию
21 А вы знаете что в питоне есть функции высшего порядка, которые позволяют принимать функцию в виде аргумента?

8(создание класса через type) Еще collections.namedtuple, который очень часто в стандартных библиотеках используется для создания нового класса.
Онлайн проверки и badges & levels это все пустяки и не очень важно. А важно то, что можно посмотреть множество вариантов решения этой задачи другими людьми, это интересно и полезно.

Тоже проходил этот курс и люблю питон. С выводами абсолютно согласен.
Pillow is the «friendly» PIL fork by Alex Clark and Contributors. PIL is the Python Imaging Library by Fredrik Lundh and Contributors.

Pillow >= 2.0.0 supports Python versions: 2.6, 2.7, 3.2, 3.3;

pypi.python.org/pypi/Pillow/2.0.0
Причем я уверен, что гуру питона наверняка найдут ещё кучу возможностей для оптимизации. Но зачем? Всё работает, код достаточно прост и лаконичен. Прям глаз радуется.

Это молодость, это пройдет. :)

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)


имя в нестандартной нотации. 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

# net = buildNetwork(64 * 64, 8 * 8, 5, hiddenclass=TanhLayer)
# net = buildNetwork(64 * 64, 32 * 32, 8 * 8, 5)
net = buildNetwork(64 * 64, 5, hiddenclass=LinearLayer)

Перед публикацией вычитывайте код. Коментированные строки излишни.

print («img.load({0}) failed!».format(png_file))

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

learn_path = os.path.abspath(args.learn_data_dir) + "/"

Попробуйте без слэша.

list_dir = os.listdir(dir_name)

Гляньте глоб docs.python.org/3.3/library/glob.html?highlight=glob.glob#glob.glob

Спасибо за библиотеку работы с картинками, а то PIL у меня под 7-64 заводится с бубнами.
12 ...
45

Information

Rating
2,833-rd
Registered
Activity