Build With Abdallah logo Build With Abdallah Software · AI · Automation
Tutorial 8 min read Jun 22, 2026

Exploring the New Features of Python 3.15 Through a Practical Project

Python 3.15 has introduced several new features and improvements that can enhance your development workflow. In this tutorial, we'll explore these features by building a practical

A
Abdallah Mohamed
Senior Full-Stack Engineer
Exploring the New Features of Python 3.15 Through a Practical Project

Exploring the New Features of Python 3.15 Through a Practical Project

What You'll Build

In this tutorial, you'll build a simple weather application that fetches and displays weather data for a given location using the new features introduced in Python 3.15. The application will be a command-line tool that leverages Python's enhancements to make the code cleaner and more efficient. By the end of this tutorial, you'll have a functional application that demonstrates practical use cases for some of the new features in Python 3.15.

Why This Matters

Python 3.15 introduces several new features that can significantly improve the way you write Python code. Understanding these features will help you:

  • Write more efficient and readable code.
  • Leverage new syntax improvements to simplify complex logic.
  • Take advantage of performance enhancements for faster execution.

This tutorial is beneficial for Python developers who want to stay up-to-date with the latest language features and apply them to real-world projects. Whether you're building small scripts or large applications, knowing what's new in Python 3.15 will enable you to write better code.

Architecture Overview

The architecture of our weather application is straightforward. Here's a simple text diagram to illustrate the flow:

[User Input] --> [Weather App] --> [Weather API] --> [Display Data]
  1. User Input: The user provides a location for which they want to retrieve weather data.
  2. Weather App: The application processes the input and communicates with a weather API.
  3. Weather API: The app fetches the current weather data from an external API.
  4. Display Data: The application displays the weather information to the user.

Step-by-Step Implementation

Step 1: Setting Up the Project

First, let's set up a basic Python project structure. Create a new directory for your project and navigate into it:

mkdir python_weather_app
cd python_weather_app

Create a new virtual environment to manage dependencies:

python3.15 -m venv venv
source venv/bin/activate  # On Windows use `venv\Scripts\activate`

Install the necessary packages. For this tutorial, we'll use requests to handle HTTP requests:

pip install requests

Step 2: Fetching Weather Data

Create a new Python file called weather.py. This file will contain the code to fetch weather data from a public API. For this tutorial, we'll use the OpenWeatherMap API. Make sure to sign up and get an API key from their website.

# weather.py

import requests

API_KEY = 'your_api_key_here'
BASE_URL = 'http://api.openweathermap.org/data/2.5/weather'

def get_weather_data(city):
    url = f"{BASE_URL}?q={city}&appid={API_KEY}&units=metric"
    response = requests.get(url)
    if response.status_code == 200:
        return response.json()
    else:
        return None

if __name__ == "__main__":
    city = input("Enter city name: ")
    data = get_weather_data(city)
    if data:
        print(f"Weather in {city}: {data['weather'][0]['description']}")
        print(f"Temperature: {data['main']['temp']}°C")
    else:
        print("Error fetching the weather data.")

Explanation:

  • We define a get_weather_data function that constructs the API request URL using the base URL, city name, and API key.
  • The function makes an HTTP GET request using requests.get().
  • If the response is successful (status code 200), it returns the JSON data; otherwise, it returns None.
  • In the main block, we prompt the user for a city name, fetch the weather data, and print the weather description and temperature.

Step 3: Utilizing New Python 3.15 Features

Now, let's refactor our code to make use of some of the new features introduced in Python 3.15. We'll focus on two features: enhanced pattern matching and improved error handling.

Update the weather.py file:

# weather.py

import requests

API_KEY = 'your_api_key_here'
BASE_URL = 'http://api.openweathermap.org/data/2.5/weather'

def get_weather_data(city):
    url = f"{BASE_URL}?q={city}&appid={API_KEY}&units=metric"
    response = requests.get(url)
    match response.status_code:
        case 200:
            return response.json()
        case 404:
            print("City not found.")
        case _:
            print("Error fetching the weather data.")
    return None

def display_weather(data, city):
    match data:
        case {'weather': [{'description': description}], 'main': {'temp': temp}}:
            print(f"Weather in {city}: {description}")
            print(f"Temperature: {temp}°C")
        case _:
            print("Unexpected data format.")

if __name__ == "__main__":
    city = input("Enter city name: ")
    data = get_weather_data(city)
    if data:
        display_weather(data, city)

Explanation:

  • Pattern Matching: We use the match statement to handle different HTTP status codes and data structures. This makes the code more readable and concise.
  • Error Handling: Instead of multiple if statements, we handle errors using pattern matching, which simplifies the error handling logic.

These changes demonstrate how Python 3.15's new features can improve the clarity and maintainability of your code. In the next steps, we'll continue to build on this foundation by exploring more new features and refining our application.

Step 4: Adding Command-Line Arguments

To enhance our application, let's add command-line argument parsing. This allows users to specify the city name directly when running the script, making it more flexible and user-friendly.

Update your weather.py file to include the argparse module:

# weather.py

import requests
import argparse

API_KEY = 'your_api_key_here'
BASE_URL = 'http://api.openweathermap.org/data/2.5/weather'

def get_weather_data(city):
    url = f"{BASE_URL}?q={city}&appid={API_KEY}&units=metric"
    response = requests.get(url)
    match response.status_code:
        case 200:
            return response.json()
        case 404:
            print("City not found.")
        case _:
            print("Error fetching the weather data.")
    return None

def display_weather(data, city):
    match data:
        case {'weather': [{'description': description}], 'main': {'temp': temp}}:
            print(f"Weather in {city}: {description}")
            print(f"Temperature: {temp}°C")
        case _:
            print("Unexpected data format.")

def parse_arguments():
    parser = argparse.ArgumentParser(description="Fetch and display weather data for a given city.")
    parser.add_argument('city', type=str, help='Name of the city to fetch weather data for')
    return parser.parse_args()

if __name__ == "__main__":
    args = parse_arguments()
    data = get_weather_data(args.city)
    if data:
        display_weather(data, args.city)

Explanation:

  • We introduce the argparse module to handle command-line arguments.
  • The parse_arguments function sets up an argument parser that expects a city name.
  • The main block now uses args.city to get the city name from the command line.

Step 5: Improving Error Handling with Context Managers

Python 3.15 enhances context managers, allowing for more robust error handling. Let's use a context manager to handle network-related errors.

Update your weather.py file:

# weather.py

import requests
import argparse
from contextlib import suppress

API_KEY = 'your_api_key_here'
BASE_URL = 'http://api.openweathermap.org/data/2.5/weather'

def get_weather_data(city):
    url = f"{BASE_URL}?q={city}&appid={API_KEY}&units=metric"
    with suppress(requests.exceptions.RequestException):
        response = requests.get(url)
        match response.status_code:
            case 200:
                return response.json()
            case 404:
                print("City not found.")
            case _:
                print("Error fetching the weather data.")
    return None

def display_weather(data, city):
    match data:
        case {'weather': [{'description': description}], 'main': {'temp': temp}}:
            print(f"Weather in {city}: {description}")
            print(f"Temperature: {temp}°C")
        case _:
            print("Unexpected data format.")

def parse_arguments():
    parser = argparse.ArgumentParser(description="Fetch and display weather data for a given city.")
    parser.add_argument('city', type=str, help='Name of the city to fetch weather data for')
    return parser.parse_args()

if __name__ == "__main__":
    args = parse_arguments()
    data = get_weather_data(args.city)
    if data:
        display_weather(data, args.city)

Explanation:

  • We use the suppress context manager from contextlib to gracefully handle network-related exceptions, such as timeouts or connection errors.

Common Mistakes

  • Incorrect API Key: Ensure your API key is correct and active. An invalid key will result in authentication errors.
  • Network Issues: If the application fails to fetch data, check your internet connection and ensure the API service is up.
  • Incorrect City Name: Misspelled city names will result in a "City not found" error. Validate inputs where possible.

How I Would Use This

This application is a great starting point for learning new Python features and can be used in personal projects or as a learning tool. For production use, consider:

  • Caching: Implement caching to reduce API calls and improve performance.
  • Error Logging: Add logging to capture errors and improve debugging.
  • Environment Configuration: Use environment variables for sensitive information like API keys.

Avoid using this script in high-traffic applications without further optimizations and error handling enhancements.

Lessons Learned

  • Tradeoffs: While new features can simplify code, they may not always be intuitive for all team members. Ensure everyone is familiar with the latest syntax.
  • Unexpected Issues: Network reliability and API rate limits can affect application performance. Always plan for these contingencies.
  • Real-World Considerations: Consider the cost associated with API usage and the impact of network latency on user experience.

Next Steps

  • Explore More Python 3.15 Features: Delve into other enhancements like improved type hinting and new standard library modules.
  • Build a GUI: Extend this application with a graphical user interface using libraries like Tkinter or PyQt.
  • Deploy to the Web: Transition this script to a web application using Flask or Django, allowing for broader accessibility.

Sources