<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/beyond-optional-in-real-world-projects-missing-none-and-unset---koudai-aono-iya9bkbcj" -->

---
title: Beyond `Optional` in Real-World Projects: Missing,...
description: [EuroPython 2026 - S4 on 2026-07-15] 🎤 *Beyond `Optional` in Real-World Projects: Missing, `None`, and Unset by Koudai Aono*   🔗...
canonical: https://daily.dev/posts/beyond-optional-in-real-world-projects-missing-none-and-unset---koudai-aono-iya9bkbcj
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Beyond `Optional` in Real-World Projects: Missing, `None`, and Unset - Koudai Aono | daily.dev
og:description: [EuroPython 2026 - S4 on 2026-07-15] 🎤 *Beyond `Optional` in Real-World Projects: Missing, `None`, and Unset by Koudai Aono*   🔗...
og:url: https://daily.dev/posts/beyond-optional-in-real-world-projects-missing-none-and-unset---koudai-aono-iya9bkbcj
og:image: https://api.daily.dev/og/posts/iYA9BkBCJ.png
og:image:alt: Beyond `Optional` in Real-World Projects: Missing, `None`, and Unset - Koudai Aono
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Beyond `Optional` in Real-World Projects: Missing, `None`, and Unset - Koudai Aono

**[EuroPython Conference](https://daily.dev/sources/europython)** · 27 min read · 0 upvotes · 0 comments

## Summary

[EuroPython 2026 - S4 on 2026-07-15]
🎤 *Beyond `Optional` in Real-World Projects: Missing, `None`, and Unset by Koudai Aono*  
🔗 https://ep2026.europython.eu/session/beyond-optional-in-real-world-projects-missing-none-and-unset 

📝 Abstract:
Have you ever merged a config file, applied an input that says "update only these fields", or handled an API payload, only to overwrite data because "missing", `None`, and "unset" were treated as the same thing?

In real-world projects, "no value" has at least three meanings:

- a missing key (the field is absent),
- an explicit `None` (the value is present and intentionally null),
- an unset input (the caller didn't specify the field, so you must not touch it).

When we collapse these into `T | None` (a nullable type) or fall back to `dict[str, Any]`, type checking becomes noisy, branching becomes fragile, and refactors get risky. Every field nullable, every check defensive, every change scary.

This is a practical talk about using typing to model and safely consume real-world data with `TypedDict` and `dataclasses`, not a typing tutorial or a framework pitch. We'll walk through one end-to-end example (payload - normalization - domain model - safe updates) with before/after code and focus on patterns you can apply immediately:

- Use `Required` / `NotRequired` to model missing keys instead of abusing `T | None`.
- Use `T | None` only when `None` is a meaningful value.
- Represent unset inputs with a sentinel pattern (starting from `UNSET = object()` and optionally evolving to `typing_extensions.Sentinel`) so partial updates don't silently overwrite data and the type checker can distinguish unset from `None`.
- Keep extraction code honest with type aliases, `TypeIs`, and (optionally) small `match` cases for readability.

After this session, you'll be able to define stricter data models, write safer extraction code, and make schema changes less painful, because your types will reflect what your data actually means. This talk is for intermediate Python developers who already use type hints in production.

---
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License: https://creativecommons.org/licenses/by-nc-sa/4.0/

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://www.youtube.com/watch?v=JuLEUIsdTjo>

---

Tags: [#python](https://daily.dev/tags/python), [#conference](https://daily.dev/tags/conference)

[View this post on daily.dev](https://daily.dev/posts/beyond-optional-in-real-world-projects-missing-none-and-unset---koudai-aono-iya9bkbcj)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Beyond `Optional` in Real-World Projects: Missing, `None`, and Unset - Koudai Aono","url":"https://daily.dev/posts/beyond-optional-in-real-world-projects-missing-none-and-unset---koudai-aono-iya9bkbcj","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/beyond-optional-in-real-world-projects-missing-none-and-unset---koudai-aono-iya9bkbcj"},"datePublished":"2026-08-19T10:14:18.885Z","dateModified":"2026-08-19T12:01:56.470Z","description":"[EuroPython 2026 - S4 on 2026-07-15]\n🎤 *Beyond `Optional` in Real-World Projects: Missing, `None`, and Unset by Koudai Aono*  \n🔗...","image":"https://i.ytimg.com/vi/JuLEUIsdTjo/sddefault.jpg","thumbnailUrl":"https://i.ytimg.com/vi/JuLEUIsdTjo/sddefault.jpg","isAccessibleForFree":true,"articleSection":"EuroPython Conference","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"EuroPython Conference","logo":"https://media.daily.dev/image/upload/s--qu8RO-lH--/f_auto,q_auto/v1777800764/logos/europython?_a=BAMAMiWQ0","url":"https://daily.dev/sources/europython"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/beyond-optional-in-real-world-projects-missing-none-and-unset---koudai-aono-iya9bkbcj","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"python,conference","timeRequired":"PT27M","video":{"@type":"VideoObject","name":"Beyond `Optional` in Real-World Projects: Missing, `None`, and Unset - Koudai Aono","description":"[EuroPython 2026 - S4 on 2026-07-15]\n🎤 *Beyond `Optional` in Real-World Projects: Missing, `None`, and Unset by Koudai Aono*  \n🔗...","thumbnailUrl":"https://i.ytimg.com/vi/JuLEUIsdTjo/sddefault.jpg","uploadDate":"2026-08-19T10:14:18.885Z","duration":"PT27M","url":"https://api.daily.dev/r/iYA9BkBCJ","embedUrl":"https://www.youtube.com/embed/JuLEUIsdTjo"}}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"EuroPython Conference","item":"https://daily.dev/sources/europython"},{"@type":"ListItem","position":3,"name":"Beyond `Optional` in Real-World Projects: Missing, `None`, and Unset - Koudai Aono"}]}
```

