Возник теоретический вопрос
Предположим, что существует функция, куда подают два параметра.
def prices(pair, market):
pair всегда ждет строку формата "BTCUSDT'. По крайней мере у всех такое API и это удобно для работы.
Но, в семье не без урода.
У одной биржи, строчное обозначение 'BTC_USDT'
Возник вопрос. Как разделить строчное значение подобного формата? Ведь, невозможно объяснить машине, где вставлять нижнее подчеркивание между заглавными буквами. Нет даже словаря общего. А валюты у всех бирж разные.
Какие варианты можно придумать? Неужели писать словарь для слепых, где 'BTCUSDT' = 'BTC_USDT'
Возможен ли такой вариант? Будет список валют и алгоритм будет склеивать две валюты друг с другом и сравнить со значением. Если значение равно, то берет первую валюту, вставляет нижнее подчеркивание и вторую.
Ответы (2 шт):
Не знаю формата строк правильного в данном случае, но попробуйте составить регулярку/wildcard, которая будет валидировать приходящие строки. Для удобства пользования можно обернуть всё в свой класс my_string_with_some_format и сделать аннотацию на этот параметр:
def prices(pair: my_string_with_some_format, market)
Можно попробовать решить через замену с помощью регулярки входного тикета пары, организовав соответствующую функцию форматирования (очищаем входную строку и сравниваем с существующим сетом уникальных пар). А дальше ее использовать уже внутри функции 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)