Улучшите свой Python - пять функций, которые нужно включить в свой код

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

Репозиторий кода

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

Код можно найти:

Https://github.com/solomonakinyemi/auction_project

Функции Python, используемые в программе

Функция 1 [Карта]

Карта - это эффективный способ перебора элементов при применении функции к каждому элементу итерации. Карта возвращает список и будет классифицироваться как расширенная функция в Python.

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

Как я использовал карту?

Приведенный ниже код считывает файл построчно, а затем передает каждую строку в функцию с именем data_classification. Каждая строка классифицируется как тип данных, содержащийся в именованной структуре данных кортежа. Тип структуры данных может быть одним из следующих: user_listing, bid или heartbeat.

Пример кода:

Функция инструкции процесса использует фрагмент кода ниже, строка 10 демонстрирует использование карты.

Функция 2 [именованные кортежи]

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

Как я использую именованный кортеж:

Кроме того, я выбрал именованный кортеж, потому что он упрощает получение значения элементов в каждой строке, считанной в программу, по имени, а не по индексу массива. Например, если программа читает в строке ниже, которая является ставкой:

1909|3|BID|tv_1|200.00

Он создает именованный кортеж с именем bid со следующими ассоциациями значений ключа:

  • отметка времени: 1909
  • user_id: 3
  • действие: BID
  • item: tv_1
  • bid_amount: 200,00

Именованный кортеж объявляется, как в примере ниже, после импорта библиотеки коллекций:

Именованные кортежи создаются с помощью функции _make, как в примере ниже:

bid = self.bid._make(row)

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

Чтобы получить сумму ставки для конкретной строки в приведенном выше примере:

bid_submitted = bid.bid_amount

Функция 3 [Виртуальная среда]

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

Как я использую виртуальную среду?

Программа аукциона имеет собственную виртуальную среду Python и поставляется с Python 3.7.2. Единственный установленный пакет - это нос == 1.3.7 для модульного тестирования.

Чтобы создать виртуальную среду, выполните следующую команду для (python ›3.7) и вторую для (python‹ 3.6). Кроме того, «аукцион_env» - это имя папки виртуальной среды, которая будет создана:

$ python3 -mvenv auction_env
or
$ pyvenv auction_env

Активируйте виртуальную среду, выполнив следующую команду:

$ source auction_env/bin/activate

и деактивировать:

$ deactivate

Установите пакет с помощью pip в виртуальную среду:

$ pip install nose==1.3.7

Функция 4 [Модульное тестирование с помощью - Nose]

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

Как я использую библиотеку носа?

Кроме того, я создал тестовый класс python, используемый для тестирования класса Server, который выполняет основную работу этой программы. Тестовый класс называется TestAuctionServer. Тесты выполняются в виртуальной среде. После установки библиотеки носа с помощью pip тест можно запустить с помощью фрагмента кода ниже. На примерах показан результат тестов:

$ nosetests -v test_auction.py
Test if data can be classified ... ok
Test empty list classification ... ok
Test if data type has been classified for timestamp ... ok
Test bid classification is accurate by using bid data type ... ok
Testing ability to process instructions ... ok
Testing the auction close times function ... ok
....

Фрагмент кода:

Функция 5 [Регистрация]

Наконец, для большинства программ важно включать ведение журнала, лично я считаю, что это так же важно, как и тестирование приложения. Поэтому я включил ведение журнала в программу аукциона.

Как я использую ведение журнала?

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

from logging.config import fileConfig
class Server:
    def __init__(self, input_file=""):
        self.logger = self.set_up_logging()

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

def set_up_logging(self):
        """
        Function used to initialise logging of activities ...
        """
        fileConfig('logging_config.ini')
        logger = logging.getLogger('auctionLogger')
        return logger

Программа записывает вывод в каталог «logs», который содержит файл с именем logfile.log.

Заключение

Таким образом, цель этой статьи - продемонстрировать некоторые полезные библиотеки Python и то, как я использовал их для создания простой программы аукциона.

Мы говорили о пяти вещах:

  • Функция карты
  • Структура данных именованных кортежей
  • Виртуальная среда
  • Библиотека тестов носа для модульного тестирования
  • Модуль регистрации

Более подробную информацию о задачах, предположениях и правилах программы можно найти в разделе приложения.

Приложение

Соревнование

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

Программа получит входной файл со списком строк трех типов. Кроме того, каждая строка отделяется вертикальной чертой:

  • Список пользователей: отметка времени | идентификатор_пользователя | действие | элемент | резерв_прайс | время_крупности
  • Ставка: отметка времени | user_id | action | item | bid_amount
  • Heartbeat: отметка времени

Ожидаемый итоговый результат:

close_time | item | user_id | status | price_paid | total_bid_count | high_bid | low_bid

Правила

  1. Заплаченная цена является второй по величине действующей ставкой.
  2. Действительные заявки поступают после начала аукциона и до закрытия аукциона.
  3. Кроме того, действительные ставки больше, чем другие предыдущие ставки, представленные пользователем.
  4. В конце аукциона победитель заплатит цену, предложившую вторую по величине цену.
  5. Если имеется только одно действительное предложение, выплачивается резервная цена.
  6. Если две заявки поступают на одинаковую сумму, то позиция выигрывает самая ранняя ставка.

Краткое изложение подхода к проекту

Следующим шаблоном проектирования является архитектура клиент-сервер. Два класса, сервер и аукцион. Кроме того, большая часть работы выполняется в классе Сервер.

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

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

Предположения проекта

  • Аукцион открывается, как только программа начинает работать, и заканчивается, когда программа останавливается.
  • Объявления закрываются, когда пульс совпадает со временем закрытия, назначенным для этого конкретного объявления
  • Код "элемента" в списке пользователей уникален, если то же имя элемента представлено в списке, то первый элемент будет указан, а второй будет проигнорирован.
  • Название элемента для списка пользователей и ставка для элемента совпадают, чтобы ставки соответствовали спискам пользователей.
  • Все заявки включают принятые заявки. Ставки ниже начальной цены, но в течение времени аукциона, будут учитываться.

Пример ввода и вывода файла:

Input file content example:
10|199|SELL|table_1|10.00|16
12|236|SELL|bed_1|10.00|22
13|404|SELL|tshirt_1|10.00|20
15|898|BID|bed_1|7.50
16|626|BID|tshirt_1|12.50
17
18|475|BID|table_1|9.00
19
20|333|BID|tshirt_1|19.00
21
22|999|BID|bed_1|20.00
23
Output:
23|table_1||UNSOLD|0.00|1|9.00|0.00
23|bed_1|999|SOLD|10.00|2|20.00|7.50
23|tshirt_1|333|SOLD|12.50|2|19.00|12.50

Описание строки списка пользователей

  • timestamp целое число, представляющее эпоху, время начала аукциона
  • user_id - целое число
  • действие будет строкой «ПРОДАТЬ».
  • элемент - уникальный строковый код для этого элемента.
  • резервная_цена - десятичное число, представляющее резервную цену товара в местной валюте.
  • close_time будет целым числом, представляющим время эпохи unix.

Описание строки ставок

  • timestamp целое число, представляющее эпоху, время ставки
  • user_id - целое число
  • действие будет строкой «BID»
  • элемент - уникальный строковый код для этого элемента.
  • bid_amount - десятичное число, представляющее ставку на аукционе в местной валюте.

Описание строки пульса

  • timestamp целое число, представляющее время эпохи

Сводное описание строки

  • close_time целое число, представляющее эпоху окончания аукциона
  • элемент - уникальный строковый код для этого элемента.
  • user_id - целое число
  • статус имеет значение «ПРОДАН» или «НЕ ПРОДАНО» в зависимости от результата аукциона.
  • Цена price_paid, уплаченная победителем аукциона (0,00, если товар НЕ ПРОДАН), в виде числа с точностью до двух десятичных знаков.
  • total_bid_count количество действительных ставок, полученных для позиции
  • high_bid наивысшая ставка, полученная за товар, в виде числа с точностью до двух десятичных знаков.
  • low_bid самая низкая ставка для товара в виде числа с точностью до двух десятичных знаков.