«Каждый дурак может написать код, понятный компьютеру. Хорошие программисты пишут код, понятный людям».

Недавно я разработал SDK аутентификации Python для WSO2 Identity Server и руководил проектом по обнаружению аномалий для стажера. В настоящее время я выполняю большинство задач по науке о данных на python. Работая над python, мы сотрудничали с конкретными стандартами для проектов, которые помогли соответствовать стандартам производственного уровня. Я хотел поделиться некоторыми ключевыми знаниями, полученными от них. Я надеюсь, что это поможет создавать стабильный, удобочитаемый и расширяемый готовый к производству код для разработчиков Python.

Я структурировал этот блог на следующие разделы.

  1. Сохраняйте модульность, чистоту и эффективность
  2. Оптимизация вашего кода
  3. Ведение журнала и инструментирование
  4. Тестирование
  5. Документация
  6. Контроль версий и проверка кода

1. Сохраняйте модульность, чистоту и эффективность

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

Модульный код — это сложный код, разбитый на более мелкие части, т. е. функции или модули. Мы получаем функции, когда разбиваем код на более мелкие функциональные группы для выполнения конкретной задачи. Мы получаем модули (или файлы Python), когда группируем эти функции. Мы можем создавать и тестировать эти модули самостоятельно. Во многих случаях эти модули можно повторно использовать в других компонентах.

Советы по написанию модульного кода.

  • СУХОЙ (не повторяйтесь)

Предположим, вы разработали сегмент кода для чтения файлов, не повторяйте этот код в другом месте. Попробуйте обобщить и объединить повторяющийся код в функциях или циклах.

Например:

Плохой код

name = 'kugan'
if name == "kugan":
    print 'Hi'
if name == "sathy":
    print 'Hi'
if name == "sathiyakugan":
    print 'Hi'

Мы можем лучше переписать этот код так,

name = 'kugan'
people = ['kugan', 'sathy', 'sathiyakugan']
if name in people:
    print 'Hi'
  • Абстрагируйте логику, чтобы улучшить читаемость

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

  • Сведите к минимуму количество сущностей (функций, классов, модулей и т. д.)

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

  • Функции должны выполнять одну задачу.

Каждая функция должна быть сосредоточена на выполнении одной задачи. Способ узнать, что функция выполняет несколько действий, состоит в том, если вы можете извлечь из нее другую часть с именем, которое не является просто переформулировкой ее реализации.

3. Оптимизация вашего кода

Я скажу, что всегда есть простой и элегантный способ сделать что-либо в Python. Ищите его, прежде чем писать код. Посещение StackOverflow — это нормально. Всегда помните: создание функции для того, что уже есть, не является питоническим.

Вот несколько приемов, которые я нашел полезными, пока писал код.

  • collections.defaultdict():
    Обычно словарь Python выдает KeyError, если вы пытаетесь получить элемент с ключом, которого в данный момент нет в словаре. Напротив, defaultdict просто создаст любые элементы, к которым вы пытаетесь получить доступ (при условии, конечно, что они еще не существуют).
    Входные данные могут быть типов list or bool or int or a custom class. Это создаст словарь со значениями по умолчанию в качестве входных данных. Например, >>vocab = collections.defaultdict(list)
    , а затем, если вы выполните
    >>vocab[‘kugan’]
    , будет возвращено [].
    Однако, несмотря на то, что ключам присвоены значения по умолчанию, ключ в операциях со словарем по-прежнему работает как обычно. Например,
    >>“b” in vocab все равно вернет False. Таким образом, вы можете избежать проверки ключей в вашем
  • zip(iterable1, iterable2): объединит эти два итерируемых объекта в соответствии с индексом. Например, a = [1,2,3], b = [4,5,6], list(zip(a,b)) вернутся. то есть список кортежей. Обратите внимание, что zip() он сам возвращает zip-объект, нам нужно заключить его в list() или set(), чтобы заставить его работать. Соответственно, вы можете проделать и обратную операцию, т.е. разархивировать, поставив звездочку перед заархивированным объектом. Например, list(zip(*zip(a,b))) вернет [(1, 2, 3), (4, 5, 6)]
  • Для конкатенации строк “”.join() быстрее, чем +=. Например, a = “hello”, a += “ world” медленнее, чем “ “.join([“hello”, “world”]). Нам нужно заключить две строки в виде списка во входных данных. Вы можете использовать все обычные операции срезов в вашем списке строк для вставки, удаления и модификации. Производительность для добавления довольно приличная. посетите здесь, чтобы узнать больше о других эффективных способах объединения строк в Python
  • Когда вы используете цикл for, во время итерации вместо выполнения for i in range(len(arr)) мы можем просто выполнить for i, elemeent in enumerate(arr).
  • Для бинарного поиска есть быстрый метод bisect, bisect_left, bisect_right, который возвращает индекс, в который мы можем вставить число, если массив уже отсортирован.
  • collections.deque() — обобщение стеков и очередей, поддерживает добавление и извлечение в любой конец за время O(1).
    Мы можем использовать этот метод в следующем реальном приложении:
    — при отмене операций в программном обеспечении.
    — для сохранения истории в браузерах.
    — для реализации как стеков, так и очередей. .
  • heapq, реализации приоритетной очереди, которые можно использовать для решения многих задач, связанных с поиском лучшего элемента в наборе данных, предлагают простое в использовании и очень эффективное решение.

2. Ведение журнала

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

  1. Предположим, ваш код не обращается к консоли; оператор печати терпит неудачу.
  2. Включение дополнительной информации журнала недоступно.
  3. Оператор печати только отображает сообщения на консоли. Запись данных журнала в файл или отправка их через Интернет требует дополнительной работы.

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

Debug: anything that happens in the program. 
Error: any error that occurs. 
Info: all user-driven or system-specific actions, such as regularly scheduled operations.

Чтобы узнать больше о логировании, обратитесь к этой статье

3. Тестирование

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

Вот некоторые ресурсы, чтобы узнать о тестировании

4. Документация

Документация — это дополнительный текст или пояснительная информация, которая поставляется с кодом программного обеспечения или встроена в него. Это помогает объяснить сложные части кода, упрощая навигацию по коду и быстро сообщая, как и почему используются различные компоненты вашей программы. Несколько типов документации могут быть добавлены на различных уровнях программы.

1. Inline comments — line level
2. Docstrings — module and function level
3. Project documentation — project level

Вот некоторые ресурсы, чтобы узнать о документации

Вот несколько README из некоторых популярных проектов:

5. Контроль версий и проверка кода

На данный момент, как вы поддерживаете свой код, чтобы он был легко доступен вам завтра? Вы храните резервную копию своего кода? Можете ли вы легко поделиться своим кодом с другими разработчиками? У вас есть файл с именами «v1», «v2», «v3», внутри и внутри? Ваш готовый файл кода называется «final1», «final2, final3», «Latest Final»? Это стрессовый способ работы. Да, системы контроля версий помогают нам управлять изменениями в файле. Существует множество систем контроля версий, таких как Git и GitHub, в качестве нашего решения для контроля версий.

Вот некоторые ресурсы, чтобы узнать о системах контроля версий

Следующие ресурсы предлагают ценные методы и инструменты для управления версиями модели и большими объемами данных.

Обзоры кода

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

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

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

Вот некоторые ресурсы, чтобы узнать о проверках кода

Наконец, я хотел бы поблагодарить Курс Udacity, который помог мне собрать ресурсы для этой статьи.

Я надеюсь, что вы нашли эту полезную статью. Спасибо. Удачного кодирования.