Класс для создания, сохранения и загрузки уникальные идентификационные номера транзакций для приложений


Этот код представляет собой класс, который я использую в своей торговле на финансовом рынке бота (примечание: Я дейтрейдера-давай-начинающий программист, а не наоборот).

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

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

Я очень открыт для рефакторинга или совершенно новый дизайн.

class UniqueTransactionRef:
    """Transaction reference number iterator 

    Loads, generates and saves unique transaction ref data for ``Bot`` orders

    :ivar file: absolute path the the .json transaction ref data file
    :ivar num: an integer representing the last generated transaction ref number
    """

    default_file = r"C:\Bot\Bot\trans_ref.json"

    def __init__(self, file=None):
        """Initialize the UniqueTransactionRef object

        :param file: an absolute path to a .json file containing the transaction
        reference number, as an integer
        """
        self.file = file if file else self.default_file
        self.num = 0
        self.load()

    def __iter__(self):
        return self

    def __next__(self):
        """Increment the self.num attribute. Save the value to the local file.

        :returns: a string formatted version of the self.num class attribute
        """
        self.num += 1
        self.save()
        return str(self.num)

    def get(self):
        """Call the ``next`` function on self """
        return next(self)

    def load(self):
        """Load the transaction ref data from the local file

        :raises errors.UniqueTransactionRefError: Cannot find file
        """
        try:
            with open(self.file) as f:
                self.num = json.load(f)
        except FileNotFoundError:
            raise errors.UniqueTransactionRefError(
                self.file,
                num=self.num,
                message="Cannot find file",
                )

    def save(self):
        """Save self.num to the designated local file

        :raises UniqueTransactionRefError: 
        """
        try:
            with open(self.file, "w") as f:
                json.dump(self.num, f)
        except Exception as e:
            raise errors.UniqueTransactionRefError(self.file,
                                                     num=self.num,
                                                     message=e)
unique_trans_ref = UniqueTransactionRef()  # module level variable

Упрощенный пример использования:

class Bot:
    def __init__(self, unique_trans_ref):
        self.unique_trans_ref = unique_trans_ref

    def construct_order():
        trans_ref = next(self.unique_trans_ref)


133
7
задан 26 февраля 2018 в 01:02 Источник Поделиться
Комментарии
1 ответ

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

Вы можете отправить последовательные номера, или случайный идентификатор GUID. Рекомендуется использовать импорт через UUID.

Рассмотрите возможность использования числовой префикс ггггммдд, с функцию strftime('%г%г%д') + '%06d' % числ. Это поможет, когда у вас есть проблемы с удаленных файлов, резервное копирование, переключение ноутбуках клиента, и так далее. Это делает идентификаторов транзакций более удобочитаемое. (Это также делает их легче угадать, если вы беспокоитесь по поводу возможного злоумышленника.)

Благодарим Вас за использование with для ввода/вывода рассмотрим приобретения замка перед сохранением обновление Counter, если вы обеспокоены тем, что несколько демонов или пользователи могут запускать примеры кода одновременно.

Нет необходимости default_fileКак вы можете просто положить, что по умолчанию в подпись:

    def __init__(self, file=r"C:\Bot\Bot\trans_ref.json"):

Вы ловите подмножество вещей, которые могут пойти неправильно с файлового ввода-вывода и парсинга JSON. Это не кажется вполне обоснованным, учитывая, что клиент не try во всяком случае, так она не заботится ли он получает неустранимая А или Б. Возможно, у вас есть использовать случай, который требует пользовательское исключение, но вы так и не показали. Скорее всего, она вам не нужна в этот момент. Я бы просто позволил библиотека load и open бросить, как они будут, и звонящий (неправильно) появляется неустранимая если кому-то случится. Позже, когда абонент осуществляет фактическое стратегии восстановления после ошибок, вы будете иметь новых требований в руку за то, что сведения об исключении должны быть возвращены, и вы можете сделать более обоснованное решение о том, как UniqueTransactionRef должны взаимодействовать с исключениями.

Писать простой код можно отделаться (это проще проверить!). Когда вы получаете новые конкретные требования стороны, сделать код немного красивее.

5
ответ дан 26 февраля 2018 в 04:02 Источник Поделиться