10 полезных советов по написанию скриптов Python

10 полезных советов по написанию скриптов Python

Хотите несколько полезных советов по скриптам Python? Читайте дальше, чтобы получить совет от профессионала!

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

Для начала мы напишем скрипт, который считывает RGB-изображение и преобразует его в оттенки серого — базовый этап предварительной обработки в компьютерном зрении. Мы будем использовать OPENCV для этого шага. Если у вас не установлен OpenCV, вы можете легко сделать это с помощью pip:

pip install opencv-python

Для этого примера я загрузил 50 изображений автомобилей Формулы-1, сохраненных в data/formula_one с файлами от 000000.jpg до 000049.jpg.

import cv2
import glob
 
image_files = sorted(glob.glob("./data/formula_one/*.jpg"))
 
for i in image_files:
   img = cv2.imread(i)
   gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
   gray_img_small = cv2.resize(gray_img, (960, 540))
   cv2.imshow('Grayscale Image', gray_img_small)
   cv2.waitKey(0)
 
cv2.destroyAllWindows()

Ниже приведен пример результатов:

Теперь, когда у нас что-то работает, давайте посмотрим, как мы можем улучшить этот скрипт с помощью первого совета по скрипту Python.

1. Подчеркните читабельность кода Python

Мой первый совет — не пишите скрипты для себя, даже если вы единственный, кто их использует. Вместо этого подумайте о себе в будущем — или, если вы пишете код Python для кого-то другого, о человеке, который будет поддерживать код после вас. Другими словами, ваш код должен быть хорошо прокомментирован, удобочитаем и понятен любому, кто взглянет на ваш скрипт Python. Если вы решите перепроектировать свой код и сделать его максимально оптимизированным за счет удобочитаемости, вы должны быть тщательными в своих комментариях.

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

import cv2
import glob
 
# Load the images in ascending order
image_files = sorted(glob.glob("./data/formula_one/*.jpg"))
 
# Loop through the files display them as grayscale
for i in image_files:
   img = cv2.imread(i)  # Read the image
   gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Convert the image to grayscale
   gray_img_small = cv2.resize(gray_img, (960, 540)) # Resize the image for visualization purpose
   cv2.imshow('Grayscale Image', gray_img_small) # Display the gray image in a window called 'Grayscale Image'
   cv2.waitKey(0) 
   
cv2.destroyAllWindows() # Close all the open windows

Теперь наш код стал намного понятнее. Позже эти комментарии помогут вам вспомнить ход мыслей при написании кода. Однако наши комментарии могут быть немного очевидными, поскольку эта статья представляет собой руководство по советам и приемам Python. В этом контексте комментарии часто объясняют «что» в коде; вместо этого часто рекомендуется писать «почему» в этом фрагменте кода. Например, я мог бы написать комментарии так:

import cv2
import glob
 

image_files = sorted(glob.glob("./data/formula_one/*.jpg"))
 
for i in image_files:
   img = cv2.imread(i)
   gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
   gray_img_small = cv2.resize(gray_img, (960, 540))
   cv2.imshow('Grayscale Image', gray_img_small)
   cv2.waitKey(0) 
 
cv2.destroyAllWindows()

2. Пишите повторно используемые функции Python

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

Давайте напишем функцию, которая принимает наш файл изображения в качестве аргумента и возвращает серое изображение без изменения размера. Мы поместим функцию в начало скрипта, сразу после импорта:

import cv2
import glob
 
# Color to Gray Function
def color2gray(filename):
   
   img = cv2.imread(filename)  # Read the image
   gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Convert the image to grayscale
   gray_img_small = cv2.resize(gray_img, (960, 540)) # Resize the image for visualization purposes
   cv2.imshow('Grayscale Image', gray_img_small) # Display the gray image in a window called 'Grayscale Image'
   cv2.waitKey(0) # Press any key to close the window
 
   return gray_img
 
# Load the images in ascending order
image_files = sorted(glob.glob("./data/formula_one/*.jpg"))
 
# Loop through the files and display the images as grayscale
for i in image_files:
  color2gray(i)
 cv2.destroyAllWindows() # Close all the open windows

3. Напишите свой собственный пакет Python

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

Следующим шагом будет организация вашего кода в класс. Это также может позволить вам использовать метод dir() для доступа к списку функций в вашем файле.

Давайте поместим нашу предыдущую функцию в новый файл Python с именем utils.py и импортируем его, как любой пакет Python. Помните, что ваш файл utils.py должен находиться в том же каталоге.

import cv2
 
# Color to Gray Function
def color2gray(filename):
   
   img = cv2.imread(filename)  # Read the image
   gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Convert the image to grayscale
   gray_img_small = cv2.resize(gray_img, (960, 540)) # Resize the image for visualization purposes
   cv2.imshow('Grayscale Image', gray_img_small) # Display the gray image in a window called 'Grayscale Image'
   cv2.waitKey(0) # Press any key to close the window
 
   return gray_img

И обновленный файл gray.py:

import cv2
import glob
import utils
 
# Load the images in ascending order
image_files = sorted(glob.glob("./data/formula_one/*.jpg"))
# Loop through the files display them as grayscale
for i in image_files:
  utils.color2gray(i)
 cv2.destroyAllWindows() # Close all the open windows

Если по какой-то причине ваш файл utils.py находится в другом каталоге, вы можете импортировать его в свой файл gray.py:

import cv2
import glob
import sys
sys.path.append("your-path-to-utils")
import utils
 
# Load the images in ascending order
image_files = sorted(glob.glob("./data/formula_one/*.jpg"))
# Loop through the files display them as grayscale
for i in image_files:
  utils.color2gray(i)
  
cv2.destroyAllWindows() # Close all the open windows

О пакетах Python нужно знать больше, но это должно помочь вам начать. Удобочитаемость — одно из преимуществ хранения ваших функций в специальном файле Python, но это также упрощает поддержку вашего кода.

Вы можете получить доступ к списку своих функций с помощью dir().

import utils
 
print(dir(utils))

Мы получаем следующий вывод:

['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'color2gray', 'cv2']

Вы видите функцию color2gray, которую мы определили ранее. Но это не все. Далее давайте перейдем к одному из моих лучших советов и приемов по Python, когда мы рассмотрим модуль argparse.

4. Включите аргументы командной строки

Хотите сделать свой сценарий многоразовым? Обобщайте это! Какая проблема — копаться в вашем предыдущем скрипте Python, чтобы отредактировать его для вашего текущего варианта использования! Так что избавьте себя от хлопот и используйте argparse. Вы поблагодарите себя позже!

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

import cv2
import glob
import utils
import argparse as ap
 
# Define an argument parser object
parser = ap.ArgumentParser()
 
# Define the arguments to add
parser.add_argument("-d", "--directory", type=str, required=True, help="Directory of files to load")
parser.add_argument("-e", "--ext", type=str, default=".jpg", help="Define file extension")
args = parser.parse_args()
 
# Load the images in ascending order
image_files = sorted(glob.glob(args.directory+"*"+args.ext))
# Loop through the files display them as grayscale
for i in image_files:
   utils.color2gray(i)
 
cv2.destroyAllWindows() # Close all the open windows

Мы можем запустить наш скрипт следующим образом:

python gray.py --directory ./data/formula_one/ --ext .jpg

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

5. Используйте строку документации вместо однострочных комментариев

Далее я рекомендую использовать docstring вместо однострочных комментариев (т. е. комментариев со знаком #). Этому есть две причины. С одной стороны, вы можете легко и правильно писать многострочные комментарии; с другой стороны, пользователь программы может получить доступ к комментариям, вызвав функцию help().

Давайте отредактируем наш файл utils.py, включив в него комментарий к строке документации:

import cv2
 
# Color to Gray Function
def color2gray(filename):
   """
   This function reads an image and converts it to grayscale.
   For visualization purposes, we resize the output as a 960x540 image.
 
   Press any key to close the window and continue.
   """
   
   img = cv2.imread(filename)
   gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
   gray_img_small = cv2.resize(gray_img, (960, 540))
   cv2.imshow('Grayscale Image', gray_img_small)
   cv2.waitKey(0)
   return gray_img
print(help(color2gray))

Затем мы можем запустить наш utils.py в терминале…

python utils.py

… и получите документацию по функциям ниже:

Help on function color2gray in module __main__:
 
color2gray(filename)
    This function reads an image and converts it to grayscale.
    For visualization purposes, we resize the output as a 960x540 image.
     
    Once the image is displayed, press any key to close the window and continue.
(END)

6. Используйте контроль версий

У вас случалось, что ваш ноутбук умирал в ваших руках из-за того, что кто-то пролил на него чашку воды? Или вы потеряли все свои файлы, потому что допустили опечатку при запуске команды Linux rm -rf для удаления каталога? И то, и другое случилось со мной, так что вам не придется повторять мою ошибку!

Чтобы не переписывать сценарии и не брать отвертку, чтобы открыть ноутбук и извлечь жесткий диск, избавьте себя от проблем с контролем версий. Доступно несколько вариантов, таких как GitLab, GitHub, Beanstalk и другие. Я лично использую GitHub. Регулярная отправка кода гарантирует, что у вас всегда будет доступная версия проекта. Это можно сделать в мгновение ока:

  • Перейдите в каталог вашего проекта и откройте терминал командной строки.
  • Введите $ git init
  • Введите $ git, добавьте имена файлов вашего проекта.
  • Введите $ git фиксации
  • Перейдите в свою учетную запись GitHub и создайте новый репозиторий.
  • В терминале командной строки введите $ git remote add origin git@github.com:your-username/your-repo
  • Введите $ git push

7. Сериализуйте свои переменные Python для повторного использования

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

В нашем предыдущем примере наша функция вернула изображение в градациях серого в виде массива NumPy; наш скрипт запускает 50 изображений. Возможно, у вас есть скрипт, выполняющий те же действия для тысяч изображений, и вам нужны эти массивы NumPy для другой цели. Мы можем сохранить эти структуры данных для повторного использования в будущем, чтобы избежать повторного запуска кода. Давайте импортируем pickle и обновим наш скрипт:

import cv2
import glob
import utils
import argparse as ap
import pickle as pkl
 
# Define an argument parser object
parser = ap.ArgumentParser()
 
# Define the arguments to add
parser.add_argument("-d", "--directory", type=str, required=True, help="Directory of files to load")
parser.add_argument("-e", "--ext", type=str, default=".jpg", help="Define file extension")
 
args = parser.parse_args()
 
# Load the images in ascending order
image_files = sorted(glob.glob(args.directory+"*"+args.ext))
# Create an empty list
gray_arr = []
# Loop through the files display them as grayscale
for i in image_files:
   arr = utils.color2gray(i)
   gray_arr.append(arr) # Append the gray arrays to a list
 
cv2.destroyAllWindows() # Close all the open windows
 
# Save the gray images as a list of Numpy arrays in a pickle file.
with open("gray_arr.pkl", "wb") as f:
   pkl.dump(gray_arr, f)

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

8. Используйте оптимизированные библиотеки Python

Мой следующий важный совет взят непосредственно из предыдущего примера, где мы сохранили кучу изображений в виде массивов NumPy — библиотеки Python, написанной на C. C — гораздо более быстрый язык, чем Python. Но Python, несмотря на то, что он медленнее, прост в использовании и, как правило, ускоряет разработку, что объясняет его популярность и универсальность.

Используя библиотеки, написанные на C, вы делаете свой код Python намного проще и быстрее. Если ваше оборудование поддерживает Cuda, вы также можете использовать CuPy, версию NumPy, оптимизированную для графических процессоров, что еще больше ускорит ваш код. Эти библиотеки также очень удобны и позволяют выполнять сложные математические операции одним вызовом функции.

9. Пишите питонический код

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

# Create an empty list
gray_arr = []
# Loop through the files display them as grayscale
for i in image_files:
   arr = utils.color2gray(i)
   gray_arr.append(arr)

Однако мы можем переписать это на Pythonic как однострочник:

gray_arr = [utils.color2gray(i) for i in image_files]

Теперь наш код стал более лаконичным и элегантным — и, прежде всего, более питоновым!

10. Позаботьтесь о возможных ошибках

Когда ваш скрипт работает правильно и не выдает никаких ошибок, это здорово. Но это редко бывает. А иногда ошибки являются частью процесса и не должны останавливать ваш скрипт. Например, вы можете захотеть очистить некоторые изображения, но запрос выдает ошибку исключения и не может вернуть ни одного изображения. Затем ваш скрипт останавливается, не выполняя инструкций, которые вы просили. Таким образом, то, как вы ЗАВЕРШАЕТЕ СВОЙ СКРИПТ PYTHON, важно. Чтобы предотвратить остановку вашего скрипта, вы можете использовать try-except; в этом случае обработка исключений только пропустит файл и предотвратит остановку вашего скрипта.

Один комментарий к “10 полезных советов по написанию скриптов Python

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *