Возник теоретический вопрос

Предположим, что существует функция, куда подают два параметра.

def prices(pair, market):

pair всегда ждет строку формата "BTCUSDT'. По крайней мере у всех такое API и это удобно для работы. Но, в семье не без урода. У одной биржи, строчное обозначение 'BTC_USDT' Возник вопрос. Как разделить строчное значение подобного формата? Ведь, невозможно объяснить машине, где вставлять нижнее подчеркивание между заглавными буквами. Нет даже словаря общего. А валюты у всех бирж разные.
Какие варианты можно придумать? Неужели писать словарь для слепых, где 'BTCUSDT' = 'BTC_USDT'

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


Ответы (2 шт):

Автор решения: user

Не знаю формата строк правильного в данном случае, но попробуйте составить регулярку/wildcard, которая будет валидировать приходящие строки. Для удобства пользования можно обернуть всё в свой класс my_string_with_some_format и сделать аннотацию на этот параметр:

def prices(pair: my_string_with_some_format, market)

→ Ссылка
Автор решения: Andy Pavlov

Можно попробовать решить через замену с помощью регулярки входного тикета пары, организовав соответствующую функцию форматирования (очищаем входную строку и сравниваем с существующим сетом уникальных пар). А дальше ее использовать уже внутри функции prices().

import re

TICKETS = ['BTC', 'USD', 'RUB']
PAIRS = set(t1 + t2 for t1 in TICKETS for t2 in TICKETS if t1 != t2)

def format_pair(pair_raw: str):
    pair_raw = re.sub('[\W+_]', '', pair_raw)
    try:
        return next(p for p in PAIRS if p in pair_raw)
    except StopIteration:
        return None

def prices(pair_raw, market):
    pair = format_pair(pair_raw)
    print(f'{pair}: {market}' if pair else 'Pair not exist')

responses_raw = ['BTC_USDT', 'EURUSD', '#B_TC_US_D']
for r in responses_raw:
    prices(r, 1.5)
→ Ссылка