Войти Регистрация
Код-ревью

34. Котировка обмена валюты в Альфа-Банке

Средняя

Python · 43 строк

Клиент вводит сумму в рублях и видит, сколько валюты получит и до какого времени держим курс. Курсы приходят из внутреннего сервиса, кэшируем на 60 секунд. Премиум-клиентам курс лучше на 0,3 %.

Серверы работают в UTC, сервис курсов иногда отвечает 503 по 10–20 минут во время перезапуска. Отметьте строки с ошибками.

В работе: Экран «Обмен валюты» в Альфа-Онлайн: котировка обновляется при каждом изменении суммы.

Как проверяем Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Ответ один на подход: после него показываем разбор.
кэшrequestsсекретыDecimalчасовые пояса

Источник: наша задача на данных Альфа-Банка: обмен валюты в приложении. Условие пересказано своими словами.

  1. import logging
  2. import time
  3. from datetime import datetime, timedelta
  4. import requests
  5. log = logging.getLogger(__name__)
  6. RATES_URL = "https://fx.internal.alfa/api/v2/rates"
  7. API_TOKEN = "fx-prod-7f3c91e2b4d84a0c"
  8. CACHE_TTL = 60
  9. _cache = {"rates": None, "loaded_at": 0.0}
  10. def load_rates():
  11. resp = requests.get(RATES_URL, headers={"Authorization": f"Bearer {API_TOKEN}"})
  12. if resp.status_code != 200:
  13. log.error("fx rates failed: %s, token=%s", resp.status_code, API_TOKEN)
  14. return _cache["rates"]
  15. return {r["pair"]: r for r in resp.json()["rates"]}
  16. def get_rates():
  17. if time.time() - _cache["loaded_at"] > CACHE_TTL:
  18. _cache["rates"] = load_rates()
  19. _cache["loaded_at"] = time.time()
  20. return _cache["rates"]
  21. def quote_exchange(amount_rub: float, pair: str, client_tier: str) -> dict:
  22. rate = get_rates()[pair]
  23. sell = float(rate["sell"])
  24. if client_tier == "premium":
  25. sell = sell - 0.5
  26. received = round(amount_rub / sell, 2)
  27. valid_until = datetime.now() + timedelta(minutes=10)
  28. return {
  29. "pair": pair,
  30. "rate": sell,
  31. "amount_rub": amount_rub,
  32. "received": received,
  33. "text": f"Курс {sell} ₽ держим до {valid_until:%H:%M} МСК",
  34. }