Real-Time Currency Converter Using Python and ExchangeRate API
Creating real-time applications in Python is not only fun but also showcases the language’s robust support for API integration and automation. In this article, we’ll build a terminal-based currency converter that fetches live exchange rates from the ExchangeRate-API and handles user input validation smoothly. Perfect for intermediate developers looking to practice working with external APIs and CLI tools.
1. Setting Up the Project Environment
Let’s begin by preparing our Python environment. This project will require Python 3.6 or above and the requests
library for making HTTP calls.
# install requests if it's not already available
pip install requests
Create a new file, say currency_converter.py
, and import the necessary libraries:
import requests
import sys
You’ll also need an API key from ExchangeRate-API. After signing up, you’ll receive a free key for development purposes.
2. Designing the Core Function to Fetch Exchange Rates
To convert currencies, we need reliable data. Here’s how to communicate with ExchangeRate-API using Python’s requests
module.
API_KEY = 'YOUR_API_KEY_HERE'
BASE_URL = f'https://v6.exchangerate-api.com/v6/{API_KEY}/latest/'
def fetch_exchange_rate(base_currency, target_currency):
url = BASE_URL + base_currency.upper()
try:
response = requests.get(url)
data = response.json()
if response.status_code != 200 or 'conversion_rates' not in data:
raise ValueError("Invalid API response")
rates = data['conversion_rates']
if target_currency.upper() not in rates:
raise ValueError("Target currency not supported")
return rates[target_currency.upper()]
except Exception as e:
print(f"Error: {e}")
sys.exit(1)
This function securely fetches the exchange rate from one currency to another. It handles bad responses gracefully, ensuring that our program remains robust.
3. Handling User Input and Validating It
We must ensure the user provides valid input—specifically, two currency codes and a numeric amount.
def get_valid_input():
base = input("Enter base currency (e.g., USD): ").strip().upper()
target = input("Enter target currency (e.g., EUR): ").strip().upper()
amount_str = input("Enter amount to convert: ").strip()
if not base.isalpha() or not target.isalpha():
print("Currency codes must be alphabetic.")
sys.exit(1)
try:
amount = float(amount_str)
if amount <= 0:
raise ValueError
except ValueError:
print("Amount must be a positive number.")
sys.exit(1)
return base, target, amount
This validation ensures users won’t crash the application with faulty input. It also keeps the interface minimal and intuitive.
4. Performing the Conversion and Displaying Results
Now that we can fetch exchange rates and validate input, we combine both steps to perform the conversion and show the result.
def convert_currency():
base, target, amount = get_valid_input()
rate = fetch_exchange_rate(base, target)
converted_amount = amount * rate
print(f"\n{amount} {base} = {converted_amount:.2f} {target} (Rate: {rate})")
You can finalize the program with this code snippet:
if __name__ == "__main__":
convert_currency()
5. Going Further: Error Handling, Performance Tips, and Enhancements
Error Handling: The current setup covers basic errors, but consider adding retries on network failure or rate limiting messages if you plan to deploy this.
import time
def safe_fetch_with_retries(base, target, attempts=3):
for i in range(attempts):
try:
return fetch_exchange_rate(base, target)
except Exception as e:
print(f"Attempt {i+1} failed: {e}")
time.sleep(2)
print("Max retries reached. Exiting.")
sys.exit(1)
Performance: Exchange rates rarely change by the second, so caching the rates locally for a short time window (e.g., 30 minutes) can save API calls and improve performance.
import datetime
RATE_CACHE = {}
CACHE_TIMEOUT = 1800 # 30 minutes in seconds
def fetch_with_cache(base, target):
now = datetime.datetime.now()
key = f"{base}_{target}"
if key in RATE_CACHE:
rate, timestamp = RATE_CACHE[key]
if (now - timestamp).total_seconds() < CACHE_TIMEOUT:
return rate
rate = fetch_exchange_rate(base, target)
RATE_CACHE[key] = (rate, now)
return rate
Enhancements:
- Allow batch conversions (e.g., convert to multiple currencies)
- Provide a list of supported currencies using the API’s metadata endpoint
- Colorize output with libraries like
colorama
to improve UX
Conclusion
Building a real-time currency converter in Python showcases how concise code can offer powerful functionality with clean interfaces. It’s a practical example of integrating third-party services, validating user input, and applying performance engineering with caching strategies. Whether you’re developing a chatbot feature or a CLI finance tool, this approach is scalable and extendable.
Happy coding!
Useful links: