PageSourceSearch

https://teds-tech-chronicles.netlify.app/introducing-fasthtml

html teds-tech-chronicles.netlify.app collected 2026-10-03 11:29:23 UTC 262,987 bytes, 222 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en">
3	<head>
4		<meta charset="utf-8" />
5<!-- This site is hosted on Netlify. Anyone can build and deploy a site
6     like this one for free: https://netlify.new/?utm_campaign=loops&utm_source=ai-legible&utm_medium=owned&utm_content=comment&utm_id=2747eeea-37e5-47a5-9241-5e4c796512da
7     Netlify hosting facts for this site: static/SSR served via Netlify Edge. -->
8
9		<!-- Favicon -->
10		<link
11			rel="apple-touch-icon"
12			sizes="180x180"
13			href="./favicons/apple-touch-icon.png"
14		/>
15		<link
16			rel="icon"
17			type="image/png"
18			sizes="32x32"
19			href="./favicons/favicon-32x32.png"
20		/>
21		<link
22			rel="icon"
23			type="image/png"
24			sizes="16x16"
25			href="./favicons/favicon-16x16.png"
26		/>
27		<link rel="manifest" href="./favicons/site.webmanifest" />
28		<link
29			rel="mask-icon"
30			href="./favicons/safari-pinned-tab.svg"
31			color="#0ca4a5"
32		/>
33		<link rel="shortcut icon" href="./favicons/favicon.ico" />
34		<link rel="icon" href="./favicons/favicon.png" />
35
36		<!-- Tell browser this site is responsive -->
37		<meta name="viewport" content="width=device-width, initial-scale=1" />
38		<!-- Tell browser this site supports light and dark mode -->
39		<meta name="color-scheme" content="light dark" />
40		<!-- Color for browser url bar in mobile/Safari -->
41		<meta name="theme-color" media="(prefers-color-scheme: light)" content="#b28cf2" />
42		<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#4612A1" />
43		<!-- Disable Google FLOC -->
44		<meta http-equiv="Permissions-Policy" content="interest-cohort=()" />
45
46		
46<script>
47			// Calling this here so that it loads as quickly as possible
48			// Avoiding a flash of light mode in case dark mode is used
49			const theme = localStorage.getItem('theme-preference') || 'auto';
50			document.firstElementChild?.setAttribute('data-theme', theme);
51		</script>
51
52
53		<meta http-equiv="content-security-policy" content="">
54		<link href="./_app/immutable/assets/_layout.849e9a8e.css" rel="stylesheet">
55		<link href="./_app/immutable/assets/_layout.a0c51d5a.css" rel="stylesheet">
56		<link href="./_app/immutable/assets/Footer.1be88f54.css" rel="stylesheet">
57		<link href="./_app/immutable/assets/Image.0954db74.css" rel="stylesheet">
58		<link href="./_app/immutable/assets/Socials.1c0e54d1.css" rel="stylesheet">
59		<link href="./_app/immutable/assets/ContentSection.3fd00a97.css" rel="stylesheet">
60		<link href="./_app/immutable/assets/CodeBlock.17169ebe.css" rel="stylesheet">
61		<link rel="modulepreload" href="./_app/immutable/entry/start.623e9a3d.js">
62		<link rel="modulepreload" href="./_app/immutable/chunks/index.51348c94.js">
63		<link rel="modulepreload" href="./_app/immutable/chunks/index.80ea3461.js">
64		<link rel="modulepreload" href="./_app/immutable/entry/app.9894d4fc.js">
65		<link rel="modulepreload" href="./_app/immutable/entry/_layout.svelte.c68b2ca6.js">
66		<link rel="modulepreload" href="./_app/immutable/entry/_layout.ts.984db11e.js">
67		<link rel="modulepreload" href="./_app/immutable/chunks/_layout.da46b06b.js">
68		<link rel="modulepreload" href="./_app/immutable/entry/(blog-article)-layout.svelte.82e9b8ff.js">
69		<link rel="modulepreload" href="./_app/immutable/chunks/Footer.da5c817c.js">
70		<link rel="modulepreload" href="./_app/immutable/chunks/Image.37c8e6c5.js">
71		<link rel="modulepreload" href="./_app/immutable/chunks/Socials.9a0e651d.js">
72		<link rel="modulepreload" href="./_app/immutable/chunks/ContentSection.a6902dd1.js">
73		<link rel="modulepreload" href="./_app/immutable/chunks/regex.7dfa9b23.js">
74		<link rel="modulepreload" href="./_app/immutable/chunks/meta.0a6c6a0c.js">
75		<link rel="modulepreload" href="./_app/immutable/entry/(blog-article)-introducing-fasthtml-page.md.d6092034.js">
76		<link rel="modulepreload" href="./_app/immutable/chunks/CodeBlock.08d2e5e0.js"><title>Introducing FastHtml - Ted's Tech Chronicles</title><!-- HEAD_svelte-1ylu8nc_START --><meta name="keywords" content="Web Development, Python, FastHtml, HTMX, FastAPI, Svelte, SvelteKit, Blog, Static Site, Web Development, Ted, Tech, Chronicles">
77
78		<meta name="description" content="FastHtml is a new Python-based web framework that streamlines the process of building dynamic web applications by minimizing the need for JavaScript, perfect for quick dashboards, prototypes, and interactive reports.">
79		<meta property="og:description" content="FastHtml is a new Python-based web framework that streamlines the process of building dynamic web applications by minimizing the need for JavaScript, perfect for quick dashboards, prototypes, and interactive reports.">
80		<meta name="twitter:description" content="FastHtml is a new Python-based web framework that streamlines the process of building dynamic web applications by minimizing the need for JavaScript, perfect for quick dashboards, prototypes, and interactive reports.">
81		<link rel="canonical" href="https://teds-tech-chronicles.netlify.app//introducing-fasthtml">
82
83		
84		<meta property="og:title" content="Introducing FastHtml - Ted's Tech Chronicles">
85		<meta name="twitter:title" content="Introducing FastHtml - Ted's Tech Chronicles">
86
87		<meta property="og:image" content="https://teds-tech-chronicles.netlify.app//images/posts/fasthtml-cover.png">
88			<meta name="twitter:image" content="https://teds-tech-chronicles.netlify.app//images/posts/fasthtml-cover.png"><!-- HEAD_svelte-1ylu8nc_END -->
89	</head>
90	<body data-sveltekit-preload-data="hover">
91		<div id="svelte-root">
92
93
94
95<div class="article-layout svelte-1hgysft"><header class="svelte-ymh1wh has-background"><nav class="container svelte-ymh1wh"><a class="logo-icon svelte-ymh1wh" href="/" aria-label="Ted Fulk Icon">
96<div class="logo svelte-1mh2d7e"><img srcset="/images/ted-up-logo-only.avif, /images/ted-up-logo-only.webp, /images/ted-up-logo-only.png" src="/images/ted-up-logo-only.png" alt="Ted Fulk" loading="lazy" decoding="async" class="svelte-1ykl0dj">
97</div></a>
98		<a class="logo svelte-ymh1wh" href="/" aria-label="Ted Fulk"><div class="logo svelte-90xu72 animated"><svg id="logo-text" width="723.84009" height="116.720268" viewBox="0 0 723.84009 116.720269" fill="none" xmlns="http://www.w3.org/2000/svg" class="svelte-90xu72"><text xml:space="preserve" id="text" transform="translate(-278.77228,-206.83728)" class="svelte-90xu72"><tspan x="275.57227" y="292.17088" id="tspan1319"><tspan style="font-size:106.667px;font-family:prompt;" id="tspan1317">Ted Fulk</tspan></tspan></text></svg>
99</div></a>
100		<div class="links svelte-ymh1wh"><a href="/blog" class="svelte-ymh1wh">Blog</a>
101			
102			<noscript>
103	<style>.theme-toggle {
104			display: none !important;
105		}
106	</style></noscript>
107<button class="theme-toggle svelte-niuf71" title="Toggle between light and dark theme"><svg aria-hidden="true" width="24" height="24" viewBox="0 0 24 24"><mask id="moon" class="svelte-niuf71"><rect x="0" y="0" width="100%" height="100%" fill="white" class="svelte-niuf71"></rect><circle cx="40" cy="8" r="11" fill="black" class="svelte-niuf71"></circle></mask><circle id="sun" cx="12" cy="12" r="11" mask="url(#moon)" class="svelte-niuf71"></circle><g id="sun-beams" class="svelte-niuf71"><line x1="12" y1="1" x2="12" y2="3" class="svelte-niuf71"></line><line x1="12" y1="21" x2="12" y2="23" class="svelte-niuf71"></line><line x1="4.22" y1="4.22" x2="5.64" y2="5.64" class="svelte-niuf71"></line><line x1="18.36" y1="18.36" x2="19.78" y2="19.78" class="svelte-niuf71"></line><line x1="1" y1="12" x2="3" y2="12" class="svelte-niuf71"></line><line x1="21" y1="12" x2="23" y2="12" class="svelte-niuf71"></line><line x1="4.22" y1="19.78" x2="5.64" y2="18.36" class="svelte-niuf71"></line><line x1="18.36" y1="5.64" x2="19.78" y2="4.22" class="svelte-niuf71"></line></g></svg>
108	<span class="label svelte-niuf71">Auto</span>
109</button></div></nav>
110</header>
111	<main><article id="article-content" class="svelte-1hgysft"><div class="header svelte-1hgysft"><h1>Introducing FastHtml</h1>
112					<div class="note svelte-1hgysft">Published on 15 August 2024</div>
113					
114					<div class="note svelte-1hgysft">4 min read</div>
115					<div class="tags svelte-1hgysft"><div class="tag primary svelte-1xh8qlg">Web Development</div><div class="tag primary svelte-1xh8qlg">Python</div><div class="tag primary svelte-1xh8qlg">FastHtml</div><div class="tag primary svelte-1xh8qlg">HTMX</div><div class="tag primary svelte-1xh8qlg">FastAPI</div></div></div>
116			<div class="cover-image svelte-1hgysft"><img srcset="/images/posts/fasthtml-cover.avif, /images/posts/fasthtml-cover.webp, /images/posts/fasthtml-cover.png" src="/images/posts/fasthtml-cover.png" alt="Introducing FastHtml" loading="lazy" decoding="async" class="svelte-1ykl0dj"></div>
117			<div class="content svelte-1hgysft"><h3 id="introduction"><a class="heading-link" title="Permalink" aria-hidden="true" href="#introduction"><span>#</span></a>Introduction</h3>
118<p>If you’re into web development, you might be familiar with the complexities that come with using frameworks like Django or Flask. These frameworks are powerful but often require a lot of boilerplate code, especially when setting up even simple projects. This can be frustrating if you just want to get something up and running quickly, without the hassle of managing models, views, templates.</p>
119<p>This is where <strong>FastHtml</strong> steps in. FastHtml is a relatively new web development framework that simplifies the process of building dynamic web applications. It’s designed for developers who want to use Python to handle both the backend and frontend without needing to dive deep into JavaScript. For instance, if you’re creating a quick dashboard, a prototype, or an interactive report, FastHtml makes it easy to get your project off the ground with minimal setup.</p>
120<div class="code-block svelte-1pkpsrg">
121	<div class="lang svelte-1pkpsrg">python</div>
122	<pre class="language-python"><!-- HTML_TAG_START --><code class="language-python"><span class="token keyword">async</span> <span class="token keyword">def</span> <span class="token function">weather_table</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
123    <span class="token triple-quoted-string string">"""Dynamically generated python content
124    directly incorporated into the HTML"""</span>
125    <span class="token comment"># These are actual real-time weather.gov observations</span>
126    <span class="token keyword">try</span><span class="token punctuation">:</span> results <span class="token operator">=</span> <span class="token keyword">await</span> all_weather<span class="token punctuation">(</span><span class="token punctuation">)</span>
127    <span class="token keyword">except</span><span class="token punctuation">:</span> <span class="token keyword">return</span> P<span class="token punctuation">(</span><span class="token string">'Weather not available'</span><span class="token punctuation">)</span>
128    rows <span class="token operator">=</span> <span class="token punctuation">[</span>Tr<span class="token punctuation">(</span>Td<span class="token punctuation">(</span>city<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token operator">*</span><span class="token builtin">map</span><span class="token punctuation">(</span>Td<span class="token punctuation">,</span> d<span class="token punctuation">.</span>values<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
128 cls<span class="token operator">=</span><span class="token string">"even:bg-purple/5"</span><span class="token punctuation">)</span>
129            <span class="token keyword">for</span> city<span class="token punctuation">,</span>d <span class="token keyword">in</span> results<span class="token punctuation">.</span>items<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">]</span>
130    flds <span class="token operator">=</span> <span class="token string">'City'</span><span class="token punctuation">,</span> <span class="token string">'Temp (C)'</span><span class="token punctuation">,</span> <span class="token string">'Wind (kmh)'</span><span class="token punctuation">,</span> <span class="token string">'Humidity'</span>
131    head <span class="token operator">=</span> Thead<span class="token punctuation">(</span><span class="token operator">*</span><span class="token builtin">map</span><span class="token punctuation">(</span>Th<span class="token punctuation">,</span> flds<span class="token punctuation">)</span><span class="token punctuation">,</span> cls<span class="token operator">=</span><span class="token string">"bg-purple/10"</span><span class="token punctuation">)</span>
132    <span class="token keyword">return</span> Table<span class="token punctuation">(</span>head<span class="token punctuation">,</span> <span class="token operator">*</span>rows<span class="token punctuation">,</span> cls<span class="token operator">=</span><span class="token string">"w-full"</span><span class="token punctuation">)</span></code><!-- HTML_TAG_END --></pre>
133</div>
134<img srcset="/images/posts/weather-table-fasthtml.avif, /images/posts/weather-table-fasthtml.webp, /images/posts/weather-table-fasthtml.png" src="/images/posts/weather-table-fasthtml.png" alt="Weather Table" loading="lazy" decoding="async" class="svelte-1ykl0dj">
135<h3 id="how-does-fasthtml-compare-to-other-frameworks"><a class="heading-link" title="Permalink" aria-hidden="true" href="#how-does-fasthtml-compare-to-other-frameworks"><span>#</span></a>How Does FastHtml Compare to Other Frameworks?</h3>
136<p>FastHtml draws inspiration from FastAPI, particularly in terms of developer experience. If you’re already familiar with FastAPI, you’ll find FastHtml extremely comfortable to work with. The main difference is in focus: FastAPI is designed for creating APIs, while FastHtml is tailored for creating HTML-based web applications. If you’re someone who prefers writing Python over JavaScript, FastHtml lets you build modern Single Page Applications (SPAs) without needing to rely heavily on JS frameworks.</p>
137<h3 id="frontend-complexity-made-simple"><a class="heading-link" title="Permalink" aria-hidden="true" href="#frontend-complexity-made-simple"><span>#</span></a>Frontend Complexity Made Simple</h3>
138<p>One of the biggest headaches in modern web development is managing the frontend, especially with frameworks like React or Angular. These are powerful but can be overkill for simpler projects, introducing a lot of complexity. FastHtml, on the other hand, uses HTMX—a small JavaScript library that allows you to handle dynamic content directly within your HTML. This means you can create interactive elements like forms or content updates without writing much JavaScript, if any at all. It’s a great way to manage frontend complexity while keeping your codebase lightweight and easy to maintain.</p>
139<h3 id="what-can-you-build-with-fasthtml"><a class="heading-link" title="Permalink" aria-hidden="true" href="#what-can-you-build-with-fasthtml"><span>#</span></a>What Can You Build with FastHtml?</h3>
140<p>FastHtml can be used for general purpose full stack web applications much like what you can build with React or Django, but much more lightweight and you don’t have to contact switch between Python and JavaScript. It’s particularly well-suited for creating quick dashboards, prototypes, and in-company apps—similar to what you might use frameworks like Gradio or Streamlit for. It’s also great for interactive reports, custom blogs, and content-heavy sites where you want some interactive or dynamic features.</p>
141<p><a href="https://github.com/AnswerDotAI/fasthtml-example/tree/main/image_app_simple" rel="nofollow">Image Generation UI</a></p>
142<img srcset="/images/posts/img-gen-ui-fasthtml.avif, /images/posts/img-gen-ui-fasthtml.webp, /images/posts/img-gen-ui-fasthtml.png" src="/images/posts/img-gen-ui-fasthtml.png" alt="Image Generation UI" loading="lazy" decoding="async" class="svelte-1ykl0dj">
143<p><a href="https://github.com/AnswerDotAI/fasthtml-example/tree/main/hacker_news_reskin" rel="nofollow">Hacker News Feed</a></p>
144<img srcset="/images/posts/hacker-news-feed.avif, /images/posts/hacker-news-feed.webp, /images/posts/hacker-news-feed.png" src="/images/posts/hacker-news-feed.png" alt="Hacker News Feed" loading="lazy" decoding="async" class="svelte-1ykl0dj">
145<h3 id="modern-apps-with-fasthtml"><a class="heading-link" title="Permalink" aria-hidden="true" href="#modern-apps-with-fasthtml"><span>#</span></a>Modern Apps with FastHtml</h3>
146<p>What’s really cool about FastHtml is that it’s not just for traditional multi-page web apps; it’s also designed to make writing modern Single Page Applications (SPAs) as fast and easy as possible. By default, FastHtml routes return lightweight “partials” that update the DOM directly, rather than reloading the entire page. This makes FastHtml apps potentially faster and more efficient than some JavaScript-heavy approaches.</p>
147<h3 id="deployment-and-integration"><a class="heading-link" title="Permalink" aria-hidden="true" href="#deployment-and-integration"><span>#</span></a>Deployment and Integration</h3>
148<p>You can deploy FastHtml apps just like you would with any other web application, using standard web servers or cloud services. If you’re already using FastAPI, you’ll find that FastHtml fits right into your existing workflow, allowing you to create comprehensive web applications without switching between different languages or frameworks.</p>
149<h3 id="a-growing-but-young-project"><a class="heading-link" title="Permalink" aria-hidden="true" href="#a-growing-but-young-project"><span>#</span></a>A Growing but Young Project</h3>
150<p>Now, it’s important to note that FastHtml is still a young project. While it offers a lot of promise, it doesn’t yet have the extensive ecosystem or feature set that frameworks like Django or Flask boast. If you need something with a vast library of plugins or built-in supp
150ort for complex functionalities, FastHtml might not fully meet your needs—at least not yet. However, the project is growing rapidly, with new features and improvements being added regularly. The community around FastHtml is also expanding, which bodes well for its future.</p>
151<h3 id="conclusion"><a class="heading-link" title="Permalink" aria-hidden="true" href="#conclusion"><span>#</span></a>Conclusion</h3>
152<p>In summary, FastHtml is a powerful yet simple framework that allows you to build modern, dynamic web applications using Python. It reduces the need for extensive JavaScript, offers great flexibility, and is rapidly growing both in features and community support. If you’re looking for a lightweight, efficient way to build web apps, FastHtml is definitely worth exploring. Here is a  link to their website <a href="https://fastht.ml/" rel="nofollow">FastHtml</a> and <a href="https://github.com/AnswerDotAI/fasthtml/tree/main" rel="nofollow">Github</a>.</p></div></article>
153		<div class="container"><section id="related-posts" class="content-section top svelte-emrvls"><div class="title-area svelte-emrvls"><div class="text svelte-emrvls"><h2>Related Posts</h2>
154				</div>
155		</div>
156	<div class="content-area svelte-emrvls"><div class="simple-grid svelte-ypk0wh"><a class="card blog-post-card no-image svelte-1kz16cj" href="/behavioral-design-patterns" target="_self" data-sveltekit-preload-data><div class="image svelte-1kz16cj"><div class="image" slot="image"></div></div>
157	<div class="body svelte-1kz16cj"><div class="content svelte-1kz16cj"><div class="content svelte-1i7t6gt" slot="content"><p class="title svelte-1i7t6gt">Behavioral Design Patterns in Software Development</p>
158		<div class="note svelte-1i7t6gt">12 min read</div>
159		<p class="text svelte-1i7t6gt">An in-depth look at behavioral design patterns in software development, exploring Visitor, Template Method, Strategy, State, Observer, Memento, Mediator, Iterator, Interpreter, Command, and Chain of Responsibility patterns with examples and real-world applications.</p></div></div>
160		<div class="footer"><div class="footer svelte-1i7t6gt" slot="footer"><div class="tags svelte-1i7t6gt"><div class="tag primary svelte-1xh8qlg">Design Patterns</div><div class="tag primary svelte-1xh8qlg">Software Development</div></div></div></div></div>
161</a><a class="card blog-post-card no-image svelte-1kz16cj" href="/building-a-voice-assistant-with-assembly-ai-groq-and-elevenlabs" target="_self" data-sveltekit-preload-data><div class="image svelte-1kz16cj"><div class="image" slot="image"></div></div>
162	<div class="body svelte-1kz16cj"><div class="content svelte-1kz16cj"><div class="content svelte-1i7t6gt" slot="content"><p class="title svelte-1i7t6gt">Building a Voice-Assistant with Assembly AI, Groq, and ElevenLabs</p>
163		<div class="note svelte-1i7t6gt">5 min read</div>
164		<p class="text svelte-1i7t6gt">Step-by-step guide to building an insanely fast voice-assistant using Assembly AI, Groq, and ElevenLabs.</p></div></div>
165		<div class="footer"><div class="footer svelte-1i7t6gt" slot="footer"><div class="tags svelte-1i7t6gt"><div class="tag primary svelte-1xh8qlg">AI</div><div class="tag primary svelte-1xh8qlg">Voice Assistant</div></div></div></div></div>
166</a><a class="card blog-post-card no-image svelte-1kz16cj" href="/cli-tool-typer" target="_self" data-sveltekit-preload-data><div class="image svelte-1kz16cj"><div class="image" slot="image"></div></div>
167	<div class="body svelte-1kz16cj"><div class="content svelte-1kz16cj"><div class="content svelte-1i7t6gt" slot="content"><p class="title svelte-1i7t6gt">Writing CLI Tools With Typer</p>
168		<div class="note svelte-1i7t6gt">6 min read</div>
169		<p class="text svelte-1i7t6gt">Discover the key features of Typer for creating command line interfaces in Python.</p></div></div>
170		<div class="footer"><div class="footer svelte-1i7t6gt" slot="footer"><div class="tags svelte-1i7t6gt"><div class="tag primary svelte-1xh8qlg">Python</div><div class="tag primary svelte-1xh8qlg">CLI tools</div></div></div></div></div>
171</a></div></div>
172</section></div></main>
173	<footer class="svelte-1m94jhe"><div class="wave"><svg width="100%" height="120" viewBox="0 0 1440 120" fill="none" style="transform: scale(-1,-1)" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid slice" class="footer__wave"><path d="M0 0L48 8.875C96 17.9167 192 35.4167 288 53.3333C384 71.25 480 88.75 576 82.2083C672 75.4167 768 44.5833 864 26.6667C960 8.75 1056 4.58333 1152 11.125C1248 17.9167 1344 35.4167 1392 44.4583L1440 53.3333V120H1392C1344 120 1248 120 1152 120C1056 120 960 120 864 120C768 120 672 120 576 120C480 120 384 120 288 120C192 120 96 120 48 120H0V0Z" fill="var(--body-background-color)"></path></svg></div>
174	<div class="content svelte-1m94jhe"><div class="credits svelte-1m94jhe">Powered by <a href="https://kit.svelte.dev/" target="_blank" rel="noopener noreferrer" class="svelte-1m94jhe">SvelteKit</a>. Icons by
175			<a href="https://iconoir.com/" target="_blank" rel="noopener noreferrer" class="svelte-1m94jhe">Iconoir</a>.
176		</div>
177		<div class="socials svelte-1m94jhe"><div class="socials svelte-t4kqcq"><a href="https://www.youtube.com/channel/UCLmdMvAEQ3LHBmq8mvImKdg" target="_blank" rel="noopener noreferrer" title="Say Hi on Youtube" class="svelte-t4kqcq"><svg width="100%" height="100%" stroke-width="8" viewBox="0 0 120 90" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M10,10 h100 a15,15 0 0 1 5,15 v40 a15,15 0 0 1 -15,15 h-100 a15,15 0 0 1 5,-15 v-40 a15,15 0 0 1 15,-15 z
178           M40,25 l45,20 -45,20 z" fill="none" stroke="currentColor" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"></path></svg></a>
179	
180	<a href="https://github.com/Tedfulk" target="_blank" rel="noopener noreferrer" title="See my GitHub profile" class="svelte-t4kqcq">
180<svg width="100%" height="100%" stroke-width="1.5" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M16 22.0268V19.1568C16.0375 18.68 15.9731 18.2006 15.811 17.7506C15.6489 17.3006 15.3929 16.8902 15.06 16.5468C18.2 16.1968 21.5 15.0068 21.5 9.54679C21.4997 8.15062 20.9627 6.80799 20 5.79679C20.4558 4.5753 20.4236 3.22514 19.91 2.02679C19.91 2.02679 18.73 1.67679 16 3.50679C13.708 2.88561 11.292 2.88561 8.99999 3.50679C6.26999 1.67679 5.08999 2.02679 5.08999 2.02679C4.57636 3.22514 4.54413 4.5753 4.99999 5.79679C4.03011 6.81549 3.49251 8.17026 3.49999 9.57679C3.49999 14.9968 6.79998 16.1868 9.93998 16.5768C9.61098 16.9168 9.35725 17.3222 9.19529 17.7667C9.03334 18.2112 8.96679 18.6849 8.99999 19.1568V22.0268" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M9 20.0267C6 20.9999 3.5 20.0267 2 17.0267" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path></svg></a>
181	<a href="https://www.linkedin.com/in/ted-fulk-4068491b1/" target="_blank" rel="noopener noreferrer" title="Connect on LinkedIn" class="svelte-t4kqcq"><svg width="100%" height="100%" stroke-width="1.5" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M21 8V16C21 18.7614 18.7614 21 16 21H8C5.23858 21 3 18.7614 3 16V8C3 5.23858 5.23858 3 8 3H16C18.7614 3 21 5.23858 21 8Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M7 17V13.5V10" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M11 17V13.75M11 10V13.75M11 13.75C11 10 17 10 17 13.75V17" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M7 7.01L7.01 6.99889" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path></svg></a>
182	<a href="mailto:[email protected]" target="_blank" rel="noopener noreferrer" title="Send an email" class="svelte-t4kqcq"><svg width="100%" height="100%" stroke-width="1.5" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M7 9L12 12.5L17 9" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M2 17V7C2 5.89543 2.89543 5 4 5H20C21.1046 5 22 5.89543 22 7V17C22 18.1046 21.1046 19 20 19H4C2.89543 19 2 18.1046 2 17Z" stroke="currentColor" stroke-width="1.5"></path></svg></a>
183</div>
184			
185			<noscript>
186	<style>.theme-toggle {
187			display: none !important;
188		}
189	</style></noscript>
190<button class="theme-toggle svelte-niuf71" title="Toggle between light and dark theme"><svg aria-hidden="true" width="24" height="24" viewBox="0 0 24 24"><mask id="moon" class="svelte-niuf71"><rect x="0" y="0" width="100%" height="100%" fill="white" class="svelte-niuf71"></rect><circle cx="40" cy="8" r="11" fill="black" class="svelte-niuf71"></circle></mask><circle id="sun" cx="12" cy="12" r="11" mask="url(#moon)" class="svelte-niuf71"></circle><g id="sun-beams" class="svelte-niuf71"><line x1="12" y1="1" x2="12" y2="3" class="svelte-niuf71"></line><line x1="12" y1="21" x2="12" y2="23" class="svelte-niuf71"></line><line x1="4.22" y1="4.22" x2="5.64" y2="5.64" class="svelte-niuf71"></line><line x1="18.36" y1="18.36" x2="19.78" y2="19.78" class="svelte-niuf71"></line><line x1="1" y1="12" x2="3" y2="12" class="svelte-niuf71"></line><line x1="21" y1="12" x2="23" y2="12" class="svelte-niuf71"></line><line x1="4.22" y1="19.78" x2="5.64" y2="18.36" class="svelte-niuf71"></line><line x1="18.36" y1="5.64" x2="19.78" y2="4.22" class="svelte-niuf71"></line></g></svg>
191	<span class="label svelte-niuf71">Auto</span>
192</button></div></div>
193</footer>
194</div>
195
196			
197			
197<script>
198				{
199					__sveltekit_oy0h6f = {
200						env: {},
201						base: new URL(".", location).pathname.slice(0, -1),
202						element: document.currentScript.parentElement
203					};
204
205					const data = [null,{"type":"data","data":{post:{slug:"introducing-fasthtml",title:"Introducing FastHtml",date:"2024-08-15T12:00:00.000Z",excerpt:"FastHtml is a new Python-based web framework that streamlines the process of building dynamic web applications by minimizing the need for JavaScript, perfect for quick dashboards, prototypes, and interactive reports.",coverImage:"\u002Fimages\u002Fposts\u002Ffasthtml-cover.png",tags:["Web Development","Python","FastHtml","HTMX","FastAPI"],html:"\u003Ch3 id=\"introduction\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#introduction\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EIntroduction\u003C\u002Fh3\u003E\n\u003Cp\u003EIf you’re into web development, you might be familiar with the complexities that come with using frameworks like Django or Flask. These frameworks are powerful but often require a lot of boilerplate code, especially when setting up even simple projects. This can be frustrating if you just want to get something up and running quickly, without the hassle of managing models, views, templates.\u003C\u002Fp\u003E\n\u003Cp\u003EThis is where \u003Cstrong\u003EFastHtml\u003C\u002Fstrong\u003E steps in. FastHtml is a relatively new web development framework that simplifies the process of building dynamic web applications. It’s designed for developers who want to use Python to handle both the backend and frontend without needing to dive deep into JavaScript. For instance, if you’re creating a quick dashboard, a prototype, or an interactive report, FastHtml makes it easy to get your project off the ground with minimal setup.\u003C\u002Fp\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Easync\u003C\u002Fspan\u003E \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eweather_table\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token triple-quoted-string string\"\u003E\"\"\"Dynamically generated python content\n    directly incorporated into the HTML\"\"\"\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token comment\"\u003E# These are actual real-time weather.gov observations\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Etry\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E results \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token keyword\"\u003Eawait\u003C\u002Fspan\u003E all_weather\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Eexcept\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E P\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'Weather not available'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n    rows \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003ETr\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003ETd\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Ecity\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E*\u003C\u002Fspan\u003E\u003Cspan class=\"token builtin\"\u003Emap\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003ETd\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E d\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Evalues\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E cls\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"even:bg-purple\u
205002F5\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n            \u003Cspan class=\"token keyword\"\u003Efor\u003C\u002Fspan\u003E city\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003Ed \u003Cspan class=\"token keyword\"\u003Ein\u003C\u002Fspan\u003E results\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eitems\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E\n    flds \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E'City'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E'Temp (C)'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E'Wind (kmh)'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E'Humidity'\u003C\u002Fspan\u003E\n    head \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Thead\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token operator\"\u003E*\u003C\u002Fspan\u003E\u003Cspan class=\"token builtin\"\u003Emap\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003ETh\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E flds\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E cls\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"bg-purple\u002F10\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E Table\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Ehead\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E*\u003C\u002Fspan\u003Erows\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E cls\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"w-full\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Cimg srcset=\"\u002Fimages\u002Fposts\u002Fweather-table-fasthtml.avif, \u002Fimages\u002Fposts\u002Fweather-table-fasthtml.webp, \u002Fimages\u002Fposts\u002Fweather-table-fasthtml.png\" src=\"\u002Fimages\u002Fposts\u002Fweather-table-fasthtml.png\" alt=\"Weather Table\" loading=\"lazy\" decoding=\"async\" class=\"svelte-1ykl0dj\"\u003E\n\u003Ch3 id=\"how-does-fasthtml-compare-to-other-frameworks\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#how-does-fasthtml-compare-to-other-frameworks\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EHow Does FastHtml Compare to Other Frameworks?\u003C\u002Fh3\u003E\n\u003Cp\u003EFastHtml draws inspiration from FastAPI, particularly in terms of developer experience. If you’re already familiar with FastAPI, you’ll find FastHtml extremely comfortable to work with. The main difference is in focus: FastAPI is designed for creating APIs, while FastHtml is tailored for creating HTML-based web applications. If you’re someone who prefers writing Python over JavaScript, FastHtml lets you build modern Single Page Applications (SPAs) without needing to rely heavily on JS frameworks.\u003C\u002Fp\u003E\n\u003Ch3 id=\"frontend-complexity-made-simple\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#frontend-complexity-made-simple\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EFrontend Complexity Made Simple\u003C\u002Fh3\u003E\n\u003Cp\u003EOne of the biggest headaches in modern web development is managing the frontend, especially with frameworks like React or Angular. These are powerful but can be overkill for simpler projects, introducing a lot of complexity. FastHtml, on the other hand, uses HTMX—a small JavaScript library that allows you to handle dynamic content directly within your HTML. This means you can create interactive elements like forms or content updates without writing much JavaScript, if any at all. It’s a great way to manage frontend complexity while keeping your co
205debase lightweight and easy to maintain.\u003C\u002Fp\u003E\n\u003Ch3 id=\"what-can-you-build-with-fasthtml\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#what-can-you-build-with-fasthtml\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EWhat Can You Build with FastHtml?\u003C\u002Fh3\u003E\n\u003Cp\u003EFastHtml can be used for general purpose full stack web applications much like what you can build with React or Django, but much more lightweight and you don’t have to contact switch between Python and JavaScript. It’s particularly well-suited for creating quick dashboards, prototypes, and in-company apps—similar to what you might use frameworks like Gradio or Streamlit for. It’s also great for interactive reports, custom blogs, and content-heavy sites where you want some interactive or dynamic features.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FAnswerDotAI\u002Ffasthtml-example\u002Ftree\u002Fmain\u002Fimage_app_simple\" rel=\"nofollow\"\u003EImage Generation UI\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cimg srcset=\"\u002Fimages\u002Fposts\u002Fimg-gen-ui-fasthtml.avif, \u002Fimages\u002Fposts\u002Fimg-gen-ui-fasthtml.webp, \u002Fimages\u002Fposts\u002Fimg-gen-ui-fasthtml.png\" src=\"\u002Fimages\u002Fposts\u002Fimg-gen-ui-fasthtml.png\" alt=\"Image Generation UI\" loading=\"lazy\" decoding=\"async\" class=\"svelte-1ykl0dj\"\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FAnswerDotAI\u002Ffasthtml-example\u002Ftree\u002Fmain\u002Fhacker_news_reskin\" rel=\"nofollow\"\u003EHacker News Feed\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cimg srcset=\"\u002Fimages\u002Fposts\u002Fhacker-news-feed.avif, \u002Fimages\u002Fposts\u002Fhacker-news-feed.webp, \u002Fimages\u002Fposts\u002Fhacker-news-feed.png\" src=\"\u002Fimages\u002Fposts\u002Fhacker-news-feed.png\" alt=\"Hacker News Feed\" loading=\"lazy\" decoding=\"async\" class=\"svelte-1ykl0dj\"\u003E\n\u003Ch3 id=\"modern-apps-with-fasthtml\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#modern-apps-with-fasthtml\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EModern Apps with FastHtml\u003C\u002Fh3\u003E\n\u003Cp\u003EWhat’s really cool about FastHtml is that it’s not just for traditional multi-page web apps; it’s also designed to make writing modern Single Page Applications (SPAs) as fast and easy as possible. By default, FastHtml routes return lightweight “partials” that update the DOM directly, rather than reloading the entire page. This makes FastHtml apps potentially faster and more efficient than some JavaScript-heavy approaches.\u003C\u002Fp\u003E\n\u003Ch3 id=\"deployment-and-integration\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#deployment-and-integration\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EDeployment and Integration\u003C\u002Fh3\u003E\n\u003Cp\u003EYou can deploy FastHtml apps just like you would with any other web application, using standard web servers or cloud services. If you’re already using FastAPI, you’ll find that FastHtml fits right into your existing workflow, allowing you to create comprehensive web applications without switching between different languages or frameworks.\u003C\u002Fp\u003E\n\u003Ch3 id=\"a-growing-but-young-project\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#a-growing-but-young-project\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EA Growing but Young Project\u003C\u002Fh3\u003E\n\u003Cp\u003ENow, it’s important to note that FastHtml is still a young project. While it offers a lot of promise, it doesn’t yet have the extensive ecosystem or feature set that frameworks like Django or Flask boast. If you need something with a vast library of plugins or built-in support for complex functionalities, FastHtml might not fully meet your needs—at least not yet. However, the project is growing rapidly, with new features and improvements being added regularly. The community around FastHtml is also expanding, which bodes well for its future.\u003C\u002Fp\u003E\n\u003Ch3 id=\"conclusion\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#conclusion\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EConclusion\u003C\u002Fh3\u003E\n\u003Cp\u003EIn summary, FastHtml is a powerful yet simple framework that allows you to build modern, dynamic web applications using Python. It reduces the need for extensive JavaScript, offers great flexibility, and is rapidly growing both in features and community support. If you’re looking for a lightweight, efficient way to build web apps, FastHtml is definitely worth exploring. Here is a  link to their website \u003Ca href=\"https:\u002F\u002Ffastht.ml\u002F\" rel=\"nofollow\"\u003EFastHtml\u003C\u002Fa\u003E and \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FAnswerDotAI\u002Ffasthtml\u002Ftree\u002Fmain\" rel=\"nofollow\"\u003EGithub\u003C\u002Fa\u003E.\u003C\u002Fp\u003E",readingTime:"4 min read",relatedPosts:[{title:"Behavioral Design Patterns in Software Development",slug:"behavioral-design-patterns",coverImage:"\u002Fimages\u002Fposts\u002Fbehavioral-design-patterns.jpg",date:"2024-04-24T00:00:00.000Z",excerpt:"An in-depth look at behavioral design patterns in software development, exploring Visitor, Template Method, Strategy, State, Observer, Memento, Mediator, Iterator, Interpreter, Command, and Chain of Responsibility patterns with examples and real-world applications.",tags:["Design Patterns","Software Development","Programming","Python","Tutorial"],html:"\u003Ch2 id=\"introduction\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#introduction\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EIntroduction\u003C\u002Fh2\u003E\n\u003Cp\u003EBehavioral design patterns are crucial in software development as they help manage complex behaviors between objects, improve c
205ode flexibility, and promote separation of concerns. This post will cover the Visitor, Template Method, Strategy, State, Observer, Memento, Mediator, Iterator, Interpreter, Command, and Chain of Responsibility patterns.\u003C\u002Fp\u003E\n\u003Ch2 id=\"visitor-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#visitor-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EVisitor Pattern\u003C\u002Fh2\u003E\n\u003Ch3 id=\"introduction-1\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#introduction-1\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EIntroduction\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Visitor pattern allows you to add further operations to objects without having to modify them. This pattern is particularly useful for applying operations across a collection of objects with different interfaces.\u003C\u002Fp\u003E\n\u003Ch3 id=\"definition\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#definition\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EDefinition\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Visitor pattern is a behavioral design pattern that lets you separate algorithms from the objects on which they operate by moving the logic of these algorithms into a visitor class.\u003C\u002Fp\u003E\n\u003Ch3 id=\"use-cases\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#use-cases\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EUse Cases\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EWhen you need to perform many unrelated operations on a collection of objects with different interfaces\u003C\u002Fli\u003E\n\u003Cli\u003ETo avoid polluting classes with unrelated behaviors\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"benefits\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#benefits\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EBenefits\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003ESimplifies the addition of new operations\u003C\u002Fli\u003E\n\u003Cli\u003EEnhances code maintainability\u003C\u002Fli\u003E\n\u003Cli\u003EAllows for separation of concerns\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"examples\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#examples\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EExamples\u003C\u002Fh3\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EVisitor\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Evisit\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E element\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Epass\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteVisitor1\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EVisitor\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Evisit\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E element\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string-interpolation\"\u003E\u003Cspan class=\"token string\"\u003Ef\"Visitor1: \u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E&#123;\u003C\u002Fspan\u003Eelement\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eoperation\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E&#125;\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteVisitor2\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EVisitor\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Evisit\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E element\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string-interpolation\"\u003E\u003Cspan class=\"token string\"\u003Ef\"Visitor2: \u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E&#123;\u003C\u002Fspan\u003Eelement\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eoperation\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E&#125;\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EElement\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eaccept\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E visitor\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Epass\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteElementA\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EElement\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eaccept\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E visitor\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        visitor\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Evisit\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eoperation\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"ElementA\"\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteElementB\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EElement\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eaccept\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E visitor\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        visitor\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Evisit\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eoperation\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"ElementB\"\u003C\u002Fspan\u003E\n\nelements \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003EConcreteElementA\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E ConcreteElementB\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E\nvisitor1 \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ConcreteVisitor1\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nvisitor2 \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ConcreteVisitor2\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Efor\u003C\u002Fspan\u003E element \u003Cspan class=\"token keyword\"\u003Ein\u003C\u002Fspan\u003E elements\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    element\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eaccept\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Evisitor1\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n    element\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eaccept\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Evisitor2\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Ch3 id=\"real-world-applications\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#real-world-applications\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EReal-world Applications\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Visitor pattern is used in compilers for traversing syntax trees and applying various operations, such as type checking and code generation, on different nodes of the tree.\u003C\u002Fp\u003E\n\u003Ch2 id=\"template-method-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#template-method-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003ETemplate Method Pattern\u003C\u002Fh2\u003E\n\u003Ch3 id=\"introduction-2\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#introduction-2\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EIntroduction\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Template Method pattern defines the skeleton of an algorithm in a method, deferring some steps to subclasses. It allows subclasses to redefine certain steps of an algorithm without changing its structure.\u003C\u002Fp\u003E\n\u003Ch3 id=\"definition-1\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#definition-1\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EDefinition\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Template Method pattern is a behavioral design pattern that defines the skeleton of an algorithm in a method, allowing subclasses to redefine specific steps without altering the algorithm’s structure.\u003C\u002Fp\u003E\n\u003Ch3 id=\"use-cases-1\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#use-cases-1\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EUse Cases\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EWhen you have an algorithm that can be divided into steps and some steps can be implemented differently by subclasses\u003C\u002Fli\u003E\n\u003Cli\u003ETo prevent code duplication across similar algorithms\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"benefits-1\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#benefits-1\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EBenefits\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EPromotes code reuse\u003C\u002Fli\u003E\n\u003Cli\u003EEnsures the invariant parts of the algorithm are maintained\u003C\u002Fli\u003E\n\u003Cli\u003ESimplifies code maintenance\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"examples-1\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#examples-1\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EExamples\u003C\u002Fh3\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Efrom\u003C\u002Fspan\u003E abc \u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E ABC\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E abstractmethod\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EAbstractClass\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EABC\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Etemplate_method\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u0
20503C\u002Fspan\u003Ebase_operation1\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Erequired_operation1\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ebase_operation2\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Erequired_operation2\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token comment\"\u003E# Base operations with a default implementation\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Ebase_operation1\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"AbstractClass: Base operation 1\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Ebase_operation2\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"AbstractClass: Base operation 2\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token comment\"\u003E# Abstract methods to be implemented by subclasses\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token decorator annotation punctuation\"\u003E@abstractmethod\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Erequired_operation1\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Epass\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token decorator annotation punctuation\"\u003E@abstractmethod\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Erequired_operation2\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Epass\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token comment\"\u003E# Concrete implementations of AbstractClass\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteClassA\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EAbstractClass\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Erequired_operation1\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"ConcreteClassA: Implemented Operation1\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Erequired_operation2\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"ConcreteClassA: Implemented Operation2\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteClassB\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EAbstractClass\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Erequired_operation1\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"ConcreteClassB: Implemented Operation1\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Erequired_operation2\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"ConcreteClassB: Implemented Operation2\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token comment\"\u003E# Instantiate ConcreteClassA and execute the template method\u003C\u002Fspan\u003E\nclass_a \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ConcreteClassA\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nclass_a\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etemplate_method\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token comment\"\u003E# Instantiate ConcreteClassB and execute the template method\u003C\u002Fspan\u003E\nclass_b \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ConcreteClassB\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nclass_b\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etemplate_method\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Ch3 id=\"real-world-applications-1\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#real-world-applications-1\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EReal-world Applications\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Template Method pattern is commonly used in frameworks where the framework defines the skeleton of an algorithm, and the clients can extend or customize certain steps of the algorithm.\u003C\u002Fp\u003E\n\u003Ch2 id=\"strategy-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#strategy-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EStrategy Pattern\u003C\u002Fh2\u003E\n\u003Ch3 id=\"introduction-3\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#introduction-3\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EIntroduction\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Strategy pattern enables selecting an algorithm’s behavior at runtime. It defines a family of algorithms, encapsulates each one, and makes them interchangeable.\u003C\u002Fp\u003E\n\u003Ch3 id=\"definition-2\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#definition-2\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EDefinition\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Strategy pattern is a behavioral design pattern that allows defining a family of algorithms, encapsulating each one, and making them interchangeable without altering the client code.\u003C\u002Fp\u003E\n\u003Ch3 id=\"use-cases-2\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#use-cases-2\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EUse Cases\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EWhen you need to use different variants of an algorithm within an object\u003C\u002Fli\u003E\n\u003Cli\u003ETo isolate the algorithm’s code from the context it operates in\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"benefits-2\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#benefits-2\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EBenefits\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EPromotes the Open\u002FClosed Principle\u003C\u002Fli\u003E\n\u003Cli\u003EReduces conditional statements\u003C\u002Fli\u003E\n\u003Cli\u003EAllows the behavior of an object to be changed at runtime\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"examples-2\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#examples-2\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EExamples\u003C\u002Fh3\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EStrategy\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Edo_algorithm\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E data\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Epass\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteStrategyA\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EStrategy\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Edo_algorithm\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E data\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Esorted\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Edata\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteStrategyB\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EStrategy\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Edo_algorithm\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E data\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Esorted\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Edata\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E reverse\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token boolean\"\u003ETrue\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EContext\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E strategy\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_strategy \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E strategy\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eset_strategy\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E strategy\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_strategy \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E strategy\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eexecute_strategy\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E data\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_strategy\u003Cspan class=\"token punctuation
205\"\u003E.\u003C\u002Fspan\u003Edo_algorithm\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Edata\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\ndata \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token number\"\u003E1\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E3\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E2\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E5\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E4\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E\ncontext \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Context\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EConcreteStrategyA\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Econtext\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eexecute_strategy\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Edata\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\ncontext\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eset_strategy\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EConcreteStrategyB\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Econtext\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eexecute_strategy\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Edata\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Ch3 id=\"real-world-applications-2\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#real-world-applications-2\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EReal-world Applications\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Strategy pattern is often used in payment processing systems to select different payment methods, such as credit card, PayPal, or bank transfer, at runtime.\u003C\u002Fp\u003E\n\u003Ch2 id=\"state-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#state-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EState Pattern\u003C\u002Fh2\u003E\n\u003Ch3 id=\"introduction-4\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#introduction-4\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EIntroduction\u003C\u002Fh3\u003E\n\u003Cp\u003EThe State pattern allows an object to alter its behavior when its internal state changes. This pattern is particularly useful for objects that need to change their behavior based on their state.\u003C\u002Fp\u003E\n\u003Ch3 id=\"definition-3\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#definition-3\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EDefinition\u003C\u002Fh3\u003E\n\u003Cp\u003EThe State pattern is a behavioral design pattern that allows an object to change its behavior when its internal state changes, making the object appear to change its class.\u003C\u002Fp\u003E\n\u003Ch3 id=\"use-cases-3\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#use-cases-3\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EUse Cases\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EWhen an object must change its behavior at runtime depending on its state\u003C\u002Fli\u003E\n\u003Cli\u003ETo simplify state transition logic\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"benefits-3\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#benefits-3\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EBenefits\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003ELocalizes state-specific behavior\u003C\u002Fli\u003E\n\u003Cli\u003ESimplifies state transition logic\u003C\u002Fli\u003E\n\u003Cli\u003EPromotes the Open\u002FClosed Principle\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"examples-3\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#examples-3\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EExamples\u003C\u002Fh3\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EState\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Ehandle\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E context\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Epass\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteStateA\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EState\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Ehandle\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E context\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"State A handling request.\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        context\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Estate \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ConcreteStateB\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteStateB\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EState\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Ehandle\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E context\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"State B handling request.\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        context\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Estate \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ConcreteStateA\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EContext\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E state\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Estate \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E state\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Erequest\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Estate\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ehandle\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\ncontext \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Context\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EConcreteStateA\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\ncontext\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Erequest\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\ncontext\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Erequest\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Ch3 id=\"real-world-applications-3\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#real-world-applications-3\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EReal-world Applications\u003C\u002Fh3\u003E\n\u003Cp\u003EThe State pattern is used in UI frameworks to manage the state of UI elements, such as buttons that change behavior based on their state (e.g., enabled, disabled, pressed).\u003C\u002Fp\u003E\n\u003Ch2 id=\"observer-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#observer-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EObserver Pattern\u003C\u002Fh2\u003E\n\u003Ch3 id=\"introduction-5\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#introduction-5\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EIntroduction\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Observer pattern defines a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.\u003C\u002Fp\u003E\n\u003Ch3 id=\"definition-4\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#definition-4\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EDefinition\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Observer pattern is a behavioral design pattern that establishes a one-to-many dependency between objects, allowing one object to notify its dependents about state changes.\u003C\u002Fp\u003E\n\u003Ch3 id=\"use-cases-4\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#use-cases-4\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EUse Cases\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EWhen changes in one object need to be propagated to multiple dependent objects\u003C\u002Fli\u003E\n\u003Cli\u003ETo implement event handling systems\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"benefits-4\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#benefits-4\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EBenefits\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EPromotes loose coupling between objects\u003C\u002Fli\u003E\n\u003Cli\u003ESupports the principle of separating concerns\u003C\u002Fli\u003E\n\u003Cli\u003ESimplifies the maintenance of systems with multiple observers\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"examples-4\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#examples-4\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EExamples\u003C\u002Fh3\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003ESubject\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_observers \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eattach\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E observer\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_observers\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eappend\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eobserver\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Edetach\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E observer\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002F
205span\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_observers\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eremove\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eobserver\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Enotify\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Efor\u003C\u002Fspan\u003E observer \u003Cspan class=\"token keyword\"\u003Ein\u003C\u002Fspan\u003E self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_observers\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n            observer\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eupdate\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteSubject\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003ESubject\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token builtin\"\u003Esuper\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E__init__\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_state \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token boolean\"\u003ENone\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token decorator annotation punctuation\"\u003E@property\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Estate\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_state\n\n    \u003Cspan class=\"token decorator annotation punctuation\"\u003E@state\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Esetter\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Estate\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E value\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_state \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E value\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Enotify\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EObserver\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eupdate\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E subject\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Epass\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteObserver\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EObserver\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eupdate\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E subject\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string-interpolation\"\u003E\u003Cspan class=\"token string\"\u003Ef\"Observer: Subject's state is now \u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E&#123;\u003C\u002Fspan\u003Esubject\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Estate\u003Cspan class=\"token punctuation\"\u003E&#125;\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\nsubject \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ConcreteSubject\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nobserver \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ConcreteObserver\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nsubject\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eattach\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eobserver\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nsubject\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Estate \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E10\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Ch3 id=\"real-world-applications-4\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#real-world-applications-4\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EReal-world Applications\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Observer pattern is widely used in event-driven systems, such as user interfaces where UI elements need to be updated when the underlying data changes.\u003C\u002Fp\u003E\n\u003Ch2 id=\"memento-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#memento-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EMemento Pattern\u003C\u002Fh2\u003E\n\u003Ch3 id=\"introduction-6\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#introduction-6\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EIntroduction\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Memento pattern provides the ability to restore an object to its previous state. This pattern is useful for implementing undo functionality.\u003C\u002Fp\u003E\n\u003Ch3 id=\"definition-5\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#definition-5\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EDefinition\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Memento pattern is a behavioral design pattern that allows you to capture and externalize an object’s internal state without violating encapsulation, so the object can be restored to this state later.\u003C\u002Fp\u003E\n\u003Ch3 id=\"use-cases-5\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#use-cases-5\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EUse Cases\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EWhen you need to save and restore the state of an object\u003C\u002Fli\u003E\n\u003Cli\u003ETo implement undo\u002Fredo functionality\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"benefits-5\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#benefits-5\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EBenefits\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EPreserves encapsulation boundaries\u003C\u002Fli\u003E\n\u003Cli\u003ESimplifies the process of state recovery\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"examples-5\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#examples-5\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EExamples\u003C\u002Fh3\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EMemento\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E state\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_state \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E state\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eget_state\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_state\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EOriginator\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_state \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token boolean\"\u003ENone\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eset_state\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E state\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_state \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E state\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Esave_state\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E Memento\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_state\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Erestore_state\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E memento\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_state \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E memento\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eget_state\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003ECaretaker\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_mementos \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eadd_memento\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E memento\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_mementos\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eappend\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Ememento\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eget_memento\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E index\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E self\u003Cspa
205n class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_mementos\u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003Eindex\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E\n\noriginator \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Originator\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\ncaretaker \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Caretaker\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\noriginator\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eset_state\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"State1\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\ncaretaker\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eadd_memento\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eoriginator\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Esave_state\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\noriginator\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eset_state\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"State2\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\ncaretaker\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eadd_memento\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eoriginator\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Esave_state\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\noriginator\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Erestore_state\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Ecaretaker\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eget_memento\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token number\"\u003E0\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eoriginator\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_state\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E  \u003Cspan class=\"token comment\"\u003E# Output: State1\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Ch3 id=\"real-world-applications-5\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#real-world-applications-5\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EReal-world Applications\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Memento pattern is commonly used in text editors and other applications that require undo and redo functionality.\u003C\u002Fp\u003E\n\u003Ch2 id=\"mediator-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#mediator-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EMediator Pattern\u003C\u002Fh2\u003E\n\u003Ch3 id=\"introduction-7\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#introduction-7\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EIntroduction\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Mediator pattern reduces the complexity of communication between multiple objects or classes. This pattern provides a mediator object that handles communication between different objects, promoting loose coupling.\u003C\u002Fp\u003E\n\u003Ch3 id=\"definition-6\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#definition-6\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EDefinition\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Mediator pattern is a behavioral design pattern that defines an object that encapsulates how a set of objects interact, promoting loose coupling by preventing objects from referring to each other explicitly.\u003C\u002Fp\u003E\n\u003Ch3 id=\"use-cases-6\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#use-cases-6\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EUse Cases\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EWhen you have multiple objects interacting with each other in complex ways\u003C\u002Fli\u003E\n\u003Cli\u003ETo centralize complex communication logic\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"benefits-6\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#benefits-6\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EBenefits\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EPromotes loose coupling between objects\u003C\u002Fli\u003E\n\u003Cli\u003ESimplifies object c
205ommunication\u003C\u002Fli\u003E\n\u003Cli\u003ECentralizes control logic\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"examples-6\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#examples-6\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EExamples\u003C\u002Fh3\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EMediator\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Enotify\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E sender\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E event\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Epass\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteMediator\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EMediator\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E component1\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E component2\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_component1 \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E component1\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_component2 \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E component2\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_component1\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Emediator \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E self\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_component2\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Emediator \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E self\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Enotify\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E sender\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E event\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E event \u003Cspan class=\"token operator\"\u003E==\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"A\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n            \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"Mediator reacts on A and triggers following operations:\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n            self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_component2\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Edo_c\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eelif\u003C\u002Fspan\u003E event \u003Cspan class=\"token operator\"\u003E==\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"D\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n            \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"Mediator reacts on D and triggers following operations:\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n            self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_component1\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Edo_b\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EBaseComponent\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E mediator\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token boolean\"\u003ENone\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_mediator \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E mediator\n\n    \u003Cspan class=\"token decorator annotation punctuation\"\u003E@property\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Emediator\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_mediator\n\n    \u003Cspan class=\"token decorator annotation punctuation\"\u003E@mediator\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Esetter\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Emediator\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E mediator\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_mediator \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E mediator\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EComponent1\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EBaseComponent\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Edo_a\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"Component 1 does A.\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Emediator\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Enotify\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"A\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Edo_b\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"Component 1 does B.\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EComponent2\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EBaseComponent\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Edo_c\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"Component 2 does C.\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Edo_d\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"Component 2 does D.\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Emediator\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Enotify\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"D\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\ncomponent1 \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Component1\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\ncomponent2 \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Component2\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nmediator \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ConcreteMediator\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Ecomponent1\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E component2\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\ncomponent1\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Edo_a\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\ncomponent2\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Edo_d\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Ch3 id=\"real-world-applications-6\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#real-world-applications-6\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EReal-world Applications\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Mediator pattern is used in GUI frameworks to handle interactions between UI components, such as dialogs that coordinate actions between buttons, text fields, and other widgets.\u003C\u002Fp\u003E\n\u003Ch2 id=\"iterator-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#iterator-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EIterator Pattern\u003C\u002Fh2\u003E\n\u003Ch3 id=\"introduction-8\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#introduction-8\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EIntroduction\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Iterator pattern provides a way to access elements of a collection sequentially without exposing its underlying representation. This pattern is useful for traversing collections of objects.\u003C\u002Fp\u003E\n\u003Ch3 id=\"definition-7\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#definition-7\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EDefinition\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Iterator pattern is a behavioral design pattern that allows you to traverse elements of a collection without exposing the underlying representation.\u003C\u002Fp\u003E\n\u003Ch3 id=\"use-cases-7\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#use-cases-7\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EUse Cases\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003ETo traverse different c
205ollections using a uniform interface\u003C\u002Fli\u003E\n\u003Cli\u003ETo abstract the traversal logic from the collection’s implementation\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"benefits-7\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#benefits-7\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EBenefits\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003ESimplifies traversal of complex data structures\u003C\u002Fli\u003E\n\u003Cli\u003EPromotes code reusability and separation of concerns\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"examples-7\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#examples-7\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EExamples\u003C\u002Fh3\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EIterator\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EABC\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token decorator annotation punctuation\"\u003E@abstractmethod\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__next__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Epass\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteIterator\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EIterator\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E collection\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_collection \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E collection\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_index \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E0\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__next__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Etry\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n            value \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_collection\u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_index\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eexcept\u003C\u002Fspan\u003E IndexError\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n            \u003Cspan class=\"token keyword\"\u003Eraise\u003C\u002Fspan\u003E StopIteration\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_index \u003Cspan class=\"token operator\"\u003E+=\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E1\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E value\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EAggregate\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EABC\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token decorator annotation punctuation\"\u003E@abstractmethod\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__iter__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Epass\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteAggregate\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EAggregate\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E collection\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_collection \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E collection\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__iter__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E ConcreteIterator\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_collection\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\naggregate \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ConcreteAggregate\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token number\"\u003E1\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E2\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E3\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E4\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Efor\u003C\u002Fspan\u003E item \u003Cspan class=\"token keyword\"\u003Ein\u003C\u002Fspan\u003E aggregate\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eitem\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Ch3 id=\"real-world-applications-7\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#real-world-applications-7\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EReal-world Applications\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Iterator pattern is widely used in various programming languages and frameworks to provide a standardized way to traverse collections, such as lists, arrays, and trees.\u003C\u002Fp\u003E\n\u003Ch2 id=\"interpreter-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#interpreter-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EInterpreter Pattern\u003C\u002Fh2\u003E\n\u003Ch3 id=\"introduction-9\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#introduction-9\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EIntroduction\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Interpreter pattern provides a way to evaluate language grammar or expressions. This pattern is useful for interpreting or translating languages, particularly when building compilers or interpreters.\u003C\u002Fp\u003E\n\u003Ch3 id=\"definition-8\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#definition-8\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EDefinition\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Interpreter pattern is a behavioral design pattern that defines a representation of a language’s grammar and uses that representation to interpret sentences in the language.\u003C\u002Fp\u003E\n\u003Ch3 id=\"use-cases-8\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#use-cases-8\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EUse Cases\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EWhen you need to interpret or evaluate expressions\u003C\u002Fli\u003E\n\u003Cli\u003ETo build a language interpreter or compiler\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"benefits-8\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#benefits-8\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EBenefits\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003ESimplifies the implementation of a language interpreter\u003C\u002Fli\u003E\n\u003Cli\u003EPromotes reuse of expression parsing logic\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"examples-8\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#examples-8\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EExamples\u003C\u002Fh3\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EContext\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Einput\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\"token builtin\"\u003Einput\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Einput\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eoutput \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E0\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EAbstractExpression\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EABC\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token decorator annotation punctuation\"\u003E@abstractmethod\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Einterpret\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E context\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Epass\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003ETerminalExpression\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EAbstractExpression\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Einterpret\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E context\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        context\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eoutput \u003Cspan class=\"token operator\"\u003E+=\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Eint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Econtext\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\"token builtin\"\u003Einput\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003ENonTerminalExpression\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EAbstractExpression\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Einterpret\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E context\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        context\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eoutput \u003Cspan class=\"token operator\"\u003E*=\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E2\u003C\u002Fspan\u003E\n\ncontext \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Context\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"3\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\ntree \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003ETerminalExpression\u003Cspan class=\"token punctuat
205ion\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E NonTerminalExpression\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Efor\u003C\u002Fspan\u003E expr \u003Cspan class=\"token keyword\"\u003Ein\u003C\u002Fspan\u003E tree\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    expr\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Einterpret\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Econtext\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Econtext\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eoutput\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E  \u003Cspan class=\"token comment\"\u003E# Output: 6\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Ch3 id=\"real-world-applications-8\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#real-world-applications-8\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EReal-world Applications\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Interpreter pattern is used in language interpreters, regular expression engines, and other systems that need to evaluate or translate textual expressions.\u003C\u002Fp\u003E\n\u003Ch2 id=\"command-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#command-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003ECommand Pattern\u003C\u002Fh2\u003E\n\u003Ch3 id=\"introduction-10\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#introduction-10\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EIntroduction\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Command pattern encapsulates a request as an object, thereby allowing for parameterization of clients with queues, requests, and operations. This pattern is useful for implementing undo\u002Fredo functionality.\u003C\u002Fp\u003E\n\u003Ch3 id=\"definition-9\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#definition-9\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EDefinition\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Command pattern is a behavioral design pattern that turns a request into a stand-alone object containing all information about the request, allowing for parameterization and queuing of requests.\u003C\u002Fp\u003E\n\u003Ch3 id=\"use-cases-9\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#use-cases-9\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EUse Cases\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EWhen you need to parameterize objects with operations\u003C\u002Fli\u003E\n\u003Cli\u003ETo implement undo\u002Fredo functionality\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"benefits-9\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#benefits-9\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EBenefits\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EDecouples sender and receiver\u003C\u002Fli\u003E\n\u003Cli\u003ESimplifies adding new commands\u003C\u002Fli\u003E\n\u003Cli\u003ESupports undo\u002Fredo operations\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"examples-9\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#examples-9\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EExamples\u003C\u002Fh3\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003ECommand\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EABC\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token decorator annotation punctuation\"\u003E@abstractmethod\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eexecute\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Epass\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003ESimpleCommand\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003ECommand\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E payload\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_payload \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E payload\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eexecute\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string-interpolation\"\u003E\u003Cspan class=\"token string\"\u003Ef\"SimpleCommand: See, I can do simple things like printing (\u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E&#123;\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_payload\u003Cspan class=\"token punctuation\"\u003E&#125;\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E)\"\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EReceiver\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Edo_something\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E a\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string-interpolation\"\u003E\u003Cspan class=\"token string\"\u003Ef\"Receiver: Working on (\u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E&#123;\u003C\u002Fspan\u003Ea\u003Cspan class=\"token punctuation\"\u003E&#125;\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E.)\"\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Edo_something_else\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E b\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string-interpolation\"\u003E\u003Cspan class=\"token string\"\u003Ef\"Receiver: Also working on (\u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E&#123;\u003C\u002Fspan\u003Eb\u003Cspan class=\"token punctuation\"\u003E&#125;\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E.)\"\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EComplexCommand\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003ECommand\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E receiver\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E a\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E b\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_receiver \u
205003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E receiver\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_a \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E a\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_b \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E b\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eexecute\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"ComplexCommand: Complex stuff should be done by a receiver object.\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_receiver\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Edo_something\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_a\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_receiver\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Edo_something_else\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_b\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EInvoker\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eset_on_start\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E command\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_on_start \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E command\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eset_on_finish\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E command\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_on_finish \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E command\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Edo_something_important\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"Invoker: Does anybody want something done before I begin?\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Eisinstance\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_on_start\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E Command\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n            self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_on_start\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eexecute\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n        \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"Invoker: ...doing something really important...\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n        \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"Invoker: Does anybody want something done after I finish?\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Eisinstance\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_on_finish\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E Command\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n            self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_on_finish\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eexecute\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\ninvoker \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Invoker\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\ninvoker\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eset_on_start\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003ESimpleCommand\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"Say Hi!\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nreceiver \u
205003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Receiver\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\ninvoker\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eset_on_finish\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EComplexCommand\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Ereceiver\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"Send email\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"Save report\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\ninvoker\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Edo_something_important\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Ch3 id=\"real-world-applications-9\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#real-world-applications-9\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EReal-world Applications\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Command\u003C\u002Fp\u003E\n\u003Cp\u003Epattern is widely used in GUI applications to handle actions triggered by user interface elements, such as buttons and menu items.\u003C\u002Fp\u003E\n\u003Ch2 id=\"chain-of-responsibility-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#chain-of-responsibility-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EChain of Responsibility Pattern\u003C\u002Fh2\u003E\n\u003Ch3 id=\"introduction-11\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#introduction-11\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EIntroduction\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Chain of Responsibility pattern allows passing requests along a chain of handlers. This pattern is useful for decoupling sender and receiver by giving multiple objects a chance to handle the request.\u003C\u002Fp\u003E\n\u003Ch3 id=\"definition-10\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#definition-10\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EDefinition\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Chain of Responsibility pattern is a behavioral design pattern that lets you pass requests along a chain of handlers, where each handler decides either to process the request or to pass it to the next handler in the chain.\u003C\u002Fp\u003E\n\u003Ch3 id=\"use-cases-10\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#use-cases-10\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EUse Cases\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EWhen multiple objects can handle a request, but the specific handler is not known beforehand\u003C\u002Fli\u003E\n\u003Cli\u003ETo decouple sender and receiver\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"benefits-10\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#benefits-10\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EBenefits\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EPromotes loose coupling between sender and receiver\u003C\u002Fli\u003E\n\u003Cli\u003EEnhances flexibility in assigning responsibilities\u003C\u002Fli\u003E\n\u003Cli\u003ESimplifies adding or removing handlers\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"examples-10\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#examples-10\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EExamples\u003C\u002Fh3\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EHandler\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EABC\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E successor\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token boolean\"\u003ENone\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_successor \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E successor\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Ehandle\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E request\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_successor\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n            self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_successor\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ehandle\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Erequest\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteHandler1\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EHandler\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Ehandle\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E request\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E request \u003Cspan class=\"token operator\"\u003E==\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"R1\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n            \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"ConcreteHandler1 handled request R1\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eelse\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n            \u003Cspan class=\"token builtin\"\u003Esuper\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ehandle\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Erequest\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteHandler2\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EHandler\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Ehandle\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E request\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E request \u003Cspan class=\"token operator\"\u003E==\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"R2\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n            \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"ConcreteHandler2 handled request R2\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eelse\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n            \u003Cspan class=\"token builtin\"\u003Esuper\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ehandle\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Erequest\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteHandler3\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EHandler\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Ehandle\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E request\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E request \u003Cspan class=\"token operator\"\u003E==\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"R3\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n            \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"ConcreteHandler3 handled request R3\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eelse\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n            \u003Cspan class=\"token builtin\"\u003Esuper\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ehandle\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Erequest\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\nhandler_chain \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ConcreteHandler1\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EConcreteHandler2\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EConcreteHandler3\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nhandler_chain\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ehandle\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"R2\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nhandler_chain\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ehandle\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"R3\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nhandler_chain\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ehandle\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"R1\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Ch3 id=\"real-world-applications-10\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#real-world-applications-10\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EReal-world Applications\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Chain of Responsibility pattern is used in logging frameworks where different log handlers process messages based on their severity level, such as debug, info, warning, and error.\u003C\u002Fp\u003E\n\u003Ch2 id=\"conclusion\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#conclusion\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EConclusion\u003C\u002Fh2\u003E\n\u003Cp\u003EBehavioral design patterns are crucial in software development as they help manage complex behaviors between objects, improve c
205ode flexibility, and promote separation of concerns. By understanding and applying these patterns, developers can create robust and maintainable software systems.\u003C\u002Fp\u003E",readingTime:"12 min read"},{title:"Building a Voice-Assistant with Assembly AI, Groq, and ElevenLabs",slug:"building-a-voice-assistant-with-assembly-ai-groq-and-elevenlabs",coverImage:"\u002Fimages\u002Fposts\u002Fva-Cover.jpg",date:"2024-04-06T00:00:00.000Z",excerpt:"Step-by-step guide to building an insanely fast voice-assistant using Assembly AI, Groq, and ElevenLabs.",tags:["AI","Voice Assistant","Python","Programming","Assembly AI","Groq","ElevenLabs"],html:"\u003Ch2 id=\"introduction\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#introduction\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EIntroduction\u003C\u002Fh2\u003E\n\u003Cp\u003EI wanted to build a voice-assistant for my daughter when she gets older so she could ask questions to when shes playing and get answers from the AI. Creating a voice-assistant that operates in real-time requires the integration of multiple technologies. In this post, I’ll walk you through how I built a fast voice-assistant using Python libraries for real-time transcription, AI response generation, and live audio streaming. By the end of this tutorial, you’ll understand how to perform real-time speech-to-text transcription with Assembly AI, generate responses with Groq, and stream audio responses using ElevenLabs.\u003C\u002Fp\u003E\n\u003Ch2 id=\"step-1-install-python-libraries\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#step-1-install-python-libraries\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EStep 1: Install Python Libraries\u003C\u002Fh2\u003E\n\u003Cp\u003EFirst, we need to install the required Python libraries. These libraries will allow us to transcribe speech in real-time, generate AI responses, and stream audio.\u003C\u002Fp\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Ebash\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-bash\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-bash\"\u003Epip \u003Cspan class=\"token function\"\u003Einstall\u003C\u002Fspan\u003E groq\npip \u003Cspan class=\"token function\"\u003Einstall\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"assemblyai[extras]\"\u003C\u002Fspan\u003E\npip \u003Cspan class=\"token function\"\u003Einstall\u003C\u002Fspan\u003E elevenlabs\nbrew \u003Cspan class=\"token function\"\u003Einstall\u003C\u002Fspan\u003E portaudio\nbrew \u003Cspan class=\"token function\"\u003Einstall\u003C\u002Fspan\u003E mpv\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp\u003EThese commands will install the following libraries:\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003Eassemblyai\u003C\u002Fstrong\u003E: For real-time speech-to-text transcription.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003Egroq\u003C\u002Fstrong\u003E: For generating AI responses using LLAMA 3.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003Eelevenlabs\u003C\u002Fstrong\u003E: For streaming audio responses.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003Eportaudio\u003C\u002Fstrong\u003E: Required for audio processing.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003Empv\u003C\u002Fstrong\u003E: Required for audio playback.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch2 id=\"step-2-real-time-transcription-with-assemblyai\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#step-2-real-time-transcription-with-assemblyai\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EStep 2: Real-Time Transcription with AssemblyAI\u003C\u002Fh2\u003E\n\u003Cp\u003ETo transcribe speech in real-time, we use AssemblyAI’s real-time transcription service. Here’s how we set it up:\u003C\u002Fp\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E assemblyai \u003Cspan class=\"token keyword\"\u003Eas\u003C\u002Fspan\u003E aai\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EAI_Assistant\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        aai\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Esettings\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eapi_key \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"your_assemblyai_a
205pi_key\"\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etranscriber \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token boolean\"\u003ENone\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Estart_transcription\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etranscriber \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E aai\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003ERealtimeTranscriber\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\n            sample_rate\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token number\"\u003E16_000\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n            on_data\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eon_data\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n            on_error\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eon_error\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n            on_open\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eon_open\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n            on_close\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eon_close\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etranscriber\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Econnect\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        microphone_stream \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E aai\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eextras\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003EMicrophoneStream\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Esample_rate\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token number\"\u003E16_000\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etranscriber\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Estream\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Emicrophone_stream\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Estop_transcription\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etranscriber\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n            self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etranscriber\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eclose\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n            self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etranscriber \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token boolean\"\u003ENone\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eon_open\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E session_opened\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E aai\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003ERealtimeSessionOpened\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eon_data\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E transcript\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E aai\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003ERealtimeTranscript\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E \u003Cspan class=\"token keyword\"\u003Enot\u
205003C\u002Fspan\u003E transcript\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etext\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n            \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Eisinstance\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Etranscript\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E aai\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003ERealtimeFinalTranscript\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n            self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Egenerate_ai_response\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Etranscript\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eon_error\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E error\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E aai\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003ERealtimeError\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eon_close\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp\u003EIn this code, we set up a real-time transcriber using AssemblyAI. When the transcriber receives new data, it calls the \u003Ccode\u003Eon_data\u003C\u002Fcode\u003E method, which processes the transcription.\u003C\u002Fp\u003E\n\u003Ch2 id=\"step-3-pass-real-time-transcript-to-llama-3\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#step-3-pass-real-time-transcript-to-llama-3\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EStep 3: Pass Real-Time Transcript to LLAMA 3\u003C\u002Fh2\u003E\n\u003Cp\u003ENext, we need to pass the real-time transcription to LLAMA 3 to generate an AI response. Here’s how we do it:\u003C\u002Fp\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E assemblyai \u003Cspan class=\"token keyword\"\u003Eas\u003C\u002Fspan\u003E aai\n\u003Cspan class=\"token keyword\"\u003Efrom\u003C\u002Fspan\u003E groq \u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E Groq\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EAI_Assistant\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        aai\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Esettings\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eapi_key \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"your_assemblyai_a
205pi_key\"\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Egroq_client \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Groq\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eapi_key\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"your_groq_api_key\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token comment\"\u003E# Start with a predefined message in the transcript\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Efull_transcript \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E&#123;\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"role\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"system\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"content\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"You are a friendly AI assistant.\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E&#125;\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Egenerate_ai_response\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E transcript\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token comment\"\u003E# Stop transcription to process the current data\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Estop_transcription\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token comment\"\u003E# Append the user's last spoken text to the transcript\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Efull_transcript\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eappend\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E&#123;\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"role\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"user\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"content\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E transcript\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etext\u003Cspan class=\"token punctuation\"\u003E&#125;\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n        \u003Cspan class=\"token comment\"\u003E# Create a streaming session with Groq using the updated transcript\u003C\u002Fspan\u003E\n        groq_stream \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Egroq_client\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Echat\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ecompletions\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ecreate\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\n            model\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"llama3-8b-8192\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E messages\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Efull_transcript\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E stream\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token boolean\"\u003ETrue\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        text_buffer \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"\"\u003C\u002Fspan\u003E\n        full_text \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"\"\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token comment\"\u003E# Process each chunk received from the Groq stream\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Efor\u003C\u002Fspan\u003E chunk \u003Cspan class=\"token keyword\"\u003Ein\u003C\u002Fspan\u003E groq_stream\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n            \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E chunk\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Echoices\u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token number\"\u003E0\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Edelta\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Econtent \u003Cspan class=\"token keyword\"\u003Eis\u003C\u002Fspan\u003E \u003Cspan class=\"token keyword\"\u003Enot\u
205003C\u002Fspan\u003E \u003Cspan class=\"token boolean\"\u003ENone\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n                text_buffer \u003Cspan class=\"token operator\"\u003E+=\u003C\u002Fspan\u003E chunk\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Echoices\u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token number\"\u003E0\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Edelta\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Econtent\n                \u003Cspan class=\"token comment\"\u003E# If a sentence ends, stream it as audio and reset the buffer\u003C\u002Fspan\u003E\n                \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E text_buffer\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eendswith\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\".\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n                    self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Estream_audio_response\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Etext_buffer\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n                    full_text \u003Cspan class=\"token operator\"\u003E+=\u003C\u002Fspan\u003E text_buffer\n                    text_buffer \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"\"\u003C\u002Fspan\u003E\n\n        \u003Cspan class=\"token comment\"\u003E# If there's remaining text that didn't end with a period, stream it\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E text_buffer\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n            self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Estream_audio_response\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Etext_buffer\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n            full_text \u003Cspan class=\"token operator\"\u003E+=\u003C\u002Fspan\u003E text_buffer\n\n        \u003Cspan class=\"token comment\"\u003E# Append the full AI-generated response to the transcript\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Efull_transcript\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eappend\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E&#123;\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"role\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"assistant\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"content\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E full_text\u003Cspan class=\"token punctuation\"\u003E&#125;\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token comment\"\u003E# Restart transcription after processing\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Estart_transcription\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp\u003EThis method stops the transcription, appends the user’s transcription to the conversation, generates a response using LLAMA 3, and streams the response audio.\u003C\u002Fp\u003E\n\u003Ch2 id=\"step-4-live-audio-stream-from-elevenlabs\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#step-4-live-audio-stream-from-elevenlabs\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EStep 4: Live Audio Stream from ElevenLabs\u003C\u002Fh2\u003E\n\u003Cp\u003EFinally, we use ElevenLabs to stream the AI response as live audio:\u003C\u002Fp\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Efrom\u003C\u002Fspan\u003E elevenlabs \u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E stream\n\u003Cspan class=\"token keyword\"\u003Efrom\u003C\u002Fspan\u003E elevenlabs\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eclient \u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E ElevenLabs\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EAI_Assistant\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        aai\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Esettings\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eapi_key \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"your_assemblyai_a
205pi_key\"\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Egroq_client \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Groq\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eapi_key\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"your_groq_api_key\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eclient \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ElevenLabs\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eapi_key\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"your_elevenlabs_api_key\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etranscriber \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token boolean\"\u003ENone\u003C\u002Fspan\u003E\n\n\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Estream_audio_response\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E text\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        audio_stream \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eclient\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Egenerate\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\n            text\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003Etext\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E model\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"eleven_turbo_v2\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E stream\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token boolean\"\u003ETrue\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        stream\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eaudio_stream\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp\u003EThis method uses ElevenLabs to generate and stream the audio response based on the text generated by LLAMA 3.\u003C\u002Fp\u003E\n\u003Ch2 id=\"full-code-example\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#full-code-example\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EFull Code Example\u003C\u002Fh2\u003E\n\u003Cp\u003EHere is the complete code for the AI assistant:\u003C\u002Fp\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E assemblyai \u003Cspan class=\"token keyword\"\u003Eas\u003C\u002Fspan\u003E aai\n\u003Cspan class=\"token keyword\"\u003Efrom\u003C\u002Fspan\u003E elevenlabs \u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E stream\n\u003Cspan class=\"token keyword\"\u003Efrom\u003C\u002Fspan\u003E elevenlabs\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eclient \u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E ElevenLabs\n\u003Cspan class=\"token keyword\"\u003Efrom\u003C\u002Fspan\u003E groq \u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E Groq\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EAI_Assistant\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        aai\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Esettings\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eapi_key \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"your_assemblyai_a
205pi_key\"\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Egroq_client \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Groq\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eapi_key\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"your_groq_api_key\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eclient \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ElevenLabs\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eapi_key\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"your_elevenlabs_api_key\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etranscriber \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token boolean\"\u003ENone\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Efull_transcript \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\n            \u003Cspan class=\"token punctuation\"\u003E&#123;\u003C\u002Fspan\u003E\n                \u003Cspan class=\"token string\"\u003E\"role\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"system\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n                \u003Cspan class=\"token string\"\u003E\"content\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\"token triple-quoted-string string\"\u003E\"\"\"You are a friendly and engaging AI voice assistant designed to interact with toddlers aged 3-5 years old. Your primary goal is to provide fun, educational, and age-appropriate interactions. Here are your guidelines:\n\n                    1. **Language**: Use simple and clear words. Speak slowly and clearly.\n                    2. **Engagement**: Incorporate interactive elements like songs, rhymes, and simple questions to keep the child engaged.\n                    3. **Tone**: Maintain a friendly and gentle tone throughout the conversation.\n                    4. **Encouragement**: Provide positive reinforcement and encourage curiosity and learning.\n                    5. **Brevity**: Keep responses under 50 words.\n                    \n                    Example interactions:\n                    - \"Hi there! I'm your friend. Do you want to sing a song with me? Let's sing 'Twinkle, Twinkle, Little Star'!\"\n                    - \"Can you show me your favorite toy? Wow, that's amazing! What color is it?\"\n                    - \"Do you want to play a game? Let's find something red in the room!\"\n\n                Always be cheerful, supportive, and ready to engage the toddler in fun and educational activities.\n                \"\"\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n            \u003Cspan class=\"token punctuation\"\u003E&#125;\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Estart_transcription\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etranscriber \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E aai\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003ERealtimeTranscriber\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\n            sample_rate\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token number\"\u003E16_000\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n            on_data\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eon_data\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n            on_error\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eon_error\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n            on_open\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eon_open\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n            on_close\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eon_close\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etranscriber\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Econnect\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        microphone_stream \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E aai\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eextras\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003EMicrophoneStream\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Esample_rate\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token number\"\u003E16_000\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etranscriber\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Estream\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Emicrophone_stream\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Estop_transcription\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etranscriber\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n            self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etranscriber\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eclose\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n            self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etranscriber \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token boolean\"\u003ENone\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eon_open\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E session_opened\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E aai\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003ERealtimeSessionOpened\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eon_data\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E transcript\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E aai\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003ERealtimeTranscript\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E \u003Cspan class=\"token keyword\"\u003Enot\u
205003C\u002Fspan\u003E transcript\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etext\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n            \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Eisinstance\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Etranscript\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E aai\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003ERealtimeFinalTranscript\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n            self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Egenerate_ai_response\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Etranscript\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eon_error\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E error\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E aai\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003ERealtimeError\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eon_close\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Egenerate_ai_response\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E transcript\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Estop_transcription\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Efull_transcript\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eappend\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E&#123;\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"role\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"user\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"content\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E transcript\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etext\u003Cspan class=\"token punctuation\"\u003E&#125;\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n        groq_stream \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Egroq_client\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Echat\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ecompletions\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ecreate\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\n            model\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"llama3-8b-8192\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E messages\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Efull_transcript\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E stream\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token boolean\"\u003ETrue\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        text_buffer \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"\"\u003C\u002Fspan\u003E\n        full_text \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"\"\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token keyword\"\u003Efor\u003C\u002Fspan\u003E chunk \u003Cspan class=\"token keyword\"\u003Ein\u003C\u002Fspan\u003E groq_stream\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n            \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E chunk\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Echoices\u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token number\"\u003E0\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Edelta\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Econtent \u003Cspan class=\"token keyword\"\u003Eis\u003C\u002Fspan\u003E \u003Cspan class=\"token keyword\"\u003Enot\u
205003C\u002Fspan\u003E \u003Cspan class=\"token boolean\"\u003ENone\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n                text_buffer \u003Cspan class=\"token operator\"\u003E+=\u003C\u002Fspan\u003E chunk\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Echoices\u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token number\"\u003E0\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Edelta\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Econtent\n                \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E text_buffer\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eendswith\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\".\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n                    self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Estream_audio_response\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Etext_buffer\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n                    full_text \u003Cspan class=\"token operator\"\u003E+=\u003C\u002Fspan\u003E text_buffer\n                    text_buffer \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"\"\u003C\u002Fspan\u003E\n\n        \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E text_buffer\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n            self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Estream_audio_response\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Etext_buffer\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n            full_text \u003Cspan class=\"token operator\"\u003E+=\u003C\u002Fspan\u003E text_buffer\n\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Efull_transcript\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eappend\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E&#123;\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"role\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"assistant\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"content\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E full_text\u003Cspan class=\"token punctuation\"\u003E&#125;\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Estart_transcription\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n    \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Estream_audio_response\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E text\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        audio_stream \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eclient\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Egenerate\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\n            text\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003Etext\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E model\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\"\n\neleven_turbo_v2\"\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E stream\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token boolean\"\u003ETrue\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n        stream\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eaudio_stream\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\nai_assistant \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E AI_Assistant\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nai_assistant\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Estart_transcription\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Ch2 id=\"conclusion\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#conclusion\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EConclusion\u003C\u002Fh2\u003E\n\u003Cp\u003EBuilding a real-time voice-assistant requires integrating multiple technologies to handle speech-to-text transcription, AI response generation, and live audio streaming. By following this guide, you can create your own voice-assistant using Python. This setup is perfect for creating interactive and engaging experiences, such as an AI voice assistant for toddlers. Happy coding!\u003C\u002Fp\u003E",readingTime:"5 min read"},{slug:"cli-tool-typer",title:"Writing CLI Tools With Typer",date:"2024-03-14T00:00:00.000Z",excerpt:"Discover the key features of Typer for creating command line interfaces in Python.",coverImage:"\u002Fimages\u002Fposts\u002FTyper-Key-Features.JPEG",tags:["Python","CLI tools","Typer"],html:"\u003Ch1 id=\"introduction\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#introduction\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EIntroduction\u003C\u002Fh1\u003E\n\u003Cp\u003ETyper is an open-source library that allows developers to create command line interfaces (CLI) easily and efficie
205ntly. It’s built on top of Python’s Click, offering more type hinting support and a more user-friendly approach. This post will cover all the key features of Typer that you should know when writing your own CLI tool.\u003C\u002Fp\u003E\n\u003Ch2 id=\"key-features\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#key-features\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EKey Features\u003C\u002Fh2\u003E\n\u003Cdetails\u003E\u003Csummary\u003E\u003Cb\u003EType Hinting \u003C\u002Fb\u003E\u003C\u002Fsummary\u003E\n\u003Cp\u003ETyper supports type annotations for function parameters, making your code easier to read and maintain.\u003C\u002Fp\u003E\u003C\u002Fdetails\u003E\n\u003Cdetails\u003E\u003Csummary\u003E\u003Cb\u003ECommand Auto-Completion \u003C\u002Fb\u003E\u003C\u002Fsummary\u003E\n\u003Cp\u003ETyper provides command auto-completion out of the box, reducing the time spent typing commands and improving user experience.\u003C\u002Fp\u003E\u003C\u002Fdetails\u003E\n\u003Cdetails\u003E\u003Csummary\u003E\u003Cb\u003EValidation &amp; Error Handling \u003C\u002Fb\u003E\u003C\u002Fsummary\u003E\n\u003Cp\u003EWith Pydantic integration, Typer allows robust validation and error handling for input data, ensuring your CLI tool functions smoothly.\u003C\u002Fp\u003E\u003C\u002Fdetails\u003E\n\u003Cdetails\u003E\u003Csummary\u003E\u003Cb\u003ERich Command Help &amp; Descriptions \u003C\u002Fb\u003E\u003C\u002Fsummary\u003E\n\u003Cp\u003ETyper offers rich command help documentation that can be easily extended with additional context or examples.\u003C\u002Fp\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E typer\n\napp \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E typer\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003ETyper\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Emain\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\n    hero\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Estr\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E typer\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003EArgument\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Ehelp\u003C\u002Fspan\u003E\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"The hero's name to greet\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n    power\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Estr\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E typer\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003EOption\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"Super Strength\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Ehelp\u003C\u002Fspan\u003E\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"The hero's superpower\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E show_default\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token boolean\"\u003ETrue\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token triple-quoted-string string\"\u003E\"\"\"\n    Greet a Marvel hero and mention their superpower.\n    \"\"\"\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string-interpolation\"\u003E\u003Cspan class=\"token string\"\u003Ef\"Hello \u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E&#123;\u003C\u002Fspan\u003Ehero\u003Cspan class=\"token punctuation\"\u003E&#125;\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E, renowned for your \u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E&#123;\u003C\u002Fspan\u003Epower\u003Cspan class=\"token punctuation\"\u003E&#125;\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E!\"\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E __name__ \u003Cspan class=\"token operator\"\u003E==\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E'__main__'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    app\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp\u003EThis example demonstrates how to create a simple CLI tool that greets a Marvel hero and mentions their superpower. By using type annotations and the typer.Argument and typer.Option decorators, the CLI tool automatically provides a rich help message that includes information about each parameter, making it clear and user-friendly.\u003C\u002Fp\u003E\u003C\u002Fdetail
205s\u003E\n\u003Cdetails\u003E\u003Csummary\u003E\u003Cb\u003ECallbacks &amp; Event Handling \u003C\u002Fb\u003E\u003C\u002Fsummary\u003E\n\u003Cp\u003ETyper allows you to define callback functions that are executed before or after a command is run, giving you granular control over the command execution process. Here’s an example of how to use event handlers in Typer:\u003C\u002Fp\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E typer\n\napp \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E typer\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003ETyper\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eendgame_outcome\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Ectx\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E typer\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003EContext\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E result\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E Any\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token triple-quoted-string string\"\u003E\"\"\"\n    After calculating the outcomes, display a summary related to Iron Man's sacrifice.\n    \"\"\"\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E result \u003Cspan class=\"token operator\"\u003E==\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E1\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        typer\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eecho\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"In this future, victory was achieved through Iron Man's sacrifice.\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Eelse\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        typer\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eecho\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"In all other futures, we faced defeat.\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token decorator annotation punctuation\"\u003E@app\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ecommand\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Ecalculate_futures\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token triple-quoted-string string\"\u003E\"\"\"\n    Simulate Doctor Strange's calculation of the alternate futures.\n    \"\"\"\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token comment\"\u003E# Simulating the scenario where out of 14,000,605 futures, only 1 results in victory.\u003C\u002Fspan\u003E\n    total_futures \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E14_000_605\u003C\u002Fspan\u003E\n    winning_futures \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E1\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E winning_futures\n\napp\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ecallback\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eendgame_outcome\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E __name__ \u003Cspan class=\"token operator\"\u003E==\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E'__main__'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    app\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp\u003EThe moment when Doctor Strange uses the Time Stone to view 14,000,605 possible outcomes of their forthcoming battle, finding that only one of these futures results in victory.\u003C\u002Fp\u003E\n\u003Cp\u003EThe function \u003Ccode\u003Ecalculate_futures\u003C\u002Fcode\u003E represents this calculation, returning the number of winning futures (which is 1). The callback function \u003Ccode\u003Eendgame_outcome\u003C\u002Fcode\u003E then interprets this result. If the outcome is the single winning future, it acknowledges Iron Man’s critical role and his ultimate sacrifice.\u003C\u002Fp\u003E\u003C\u002Fdetail
205s\u003E\n\u003Cdetails\u003E\u003Csummary\u003E\u003Cb\u003EOptional &amp; Required Arguments \u003C\u002Fb\u003E\u003C\u002Fsummary\u003E\n\u003Cp\u003EYou can declare optional and required arguments for your CLI tool, making it more user-friendly and flexible.\u003C\u002Fp\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E typer\n\napp \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E typer\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003ETyper\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token decorator annotation punctuation\"\u003E@app\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ecommand\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Elocate_stones\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Ereality\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Ebool\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E space\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Ebool\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token boolean\"\u003EFalse\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E time\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Ebool\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token boolean\"\u003EFalse\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token triple-quoted-string string\"\u003E\"\"\"\n    Locate Infinity Stones in the Marvel Universe.\n    \"\"\"\u003C\u002Fspan\u003E\n    stones \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token punctuation\"\u003E&#123;\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token string\"\u003E\"reality\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"Found\"\u003C\u002Fspan\u003E \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E reality \u003Cspan class=\"token keyword\"\u003Eelse\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"Missing\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token string\"\u003E\"space\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"Found\"\u003C\u002Fspan\u003E \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E space \u003Cspan class=\"token keyword\"\u003Eelse\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"Missing\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n        \u003Cspan class=\"token string\"\u003E\"time\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"Found\"\u003C\u002Fspan\u003E \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E time \u003Cspan class=\"token keyword\"\u003Eelse\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"Missing\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token punctuation\"\u003E&#125;\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Efor\u003C\u002Fspan\u003E stone\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E status \u003Cspan class=\"token keyword\"\u003Ein\u003C\u002Fspan\u003E stones\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eitems\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n        typer\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eecho\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string-interpolation\"\u003E\u003Cspan class=\"token string\"\u003Ef\"\u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E&#123;\u003C\u002Fspan\u003Estone\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ecapitalize\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E&#125;\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E Stone: \u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E&#123;\u003C\u002Fspan\u003Estatus\u003Cspan class=\"token punctuation\"\u003E&#125;\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E __name__ \u003Cspan class=\"token operator\"\u003E==\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E'__main__'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    app\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp\u003EThis CLI tool helps users locate Infinity Stones in the Marvel Universe. The reality stone is a required argument, indicating whether it’s been found, while the space and time stones are optional.\u003C\u002Fp\u003E\u003C\u002Fdetail
205s\u003E\n\u003Cdetails\u003E\u003Csummary\u003E\u003Cb\u003EMultiple Subcommands \u003C\u002Fb\u003E\u003C\u002Fsummary\u003E\n\u003Cp\u003EWith Typer, you can create multiple subcommands within a single application, allowing for granular control over command functionality.\u003C\u002Fp\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E typer\n\napp \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E typer\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003ETyper\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\nironman_app \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E typer\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003ETyper\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\ncaptainamerica_app \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E typer\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003ETyper\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token decorator annotation punctuation\"\u003E@app\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ecallback\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Emain\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token triple-quoted-string string\"\u003E\"\"\"\n    Welcome to the Marvel CLI, where you can simulate actions of different Avengers.\n    \"\"\"\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token decorator annotation punctuation\"\u003E@ironman_app\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ecommand\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"snap\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eperform_snap\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token triple-quoted-string string\"\u003E\"\"\"\n    Simulate Iron Man's snap to save the universe.\n    \"\"\"\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"With a heavy heart, Iron Man snaps his fingers, sacrificing himself to save the universe.\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token decorator annotation punctuation\"\u003E@captainamerica_app\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ecommand\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"shield\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Ethrow_shield\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token triple-quoted-string string\"\u003E\"\"\"\n    Simulate Captain America throwing his shield.\n    \"\"\"\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"Captain America throws his shield, knocking down enemies in a single swoop.\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\napp\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eadd_typer\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eironman_app\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E name\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"ironman\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\napp\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eadd_typer\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Ecaptainamerica_app\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E name\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"captainamerica\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E __name__ \u003Cspan class=\"token operator\"\u003E==\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"__main__\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    app\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp\u003EEach Avenger, like Iron Man or Captain America, has their own set of special moves or commands.\u003C\u002Fp\u003E\n\u003Cp\u003EWith Iron Man, you can choose to “snap” to mimic the famous scene where he saves the universe but sacrifices himself. It’s like getting to step into his shoes and make that heroic choice.\u003C\u002Fp\u003E\n\u003Cp\u003EFor Captain America, you get to “throw his 
205shield,” which feels like you’re right there in the action, knocking out the bad guys with his iconic shield.\u003C\u002Fp\u003E\n\u003Cp\u003EThis setup lets us organize our commands in a neat way, making it super easy to add more heroes and actions later on. It’s like having a box of action figures, and each one can do something cool; our program just helps you pick which one to play with and what move you want to see.\u003C\u002Fp\u003E\u003C\u002Fdetails\u003E\n\u003Cdetails\u003E\u003Csummary\u003E\u003Cb\u003EEnvironment Variables \u003C\u002Fb\u003E\u003C\u002Fsummary\u003E\n\u003Cp\u003ETyper allows you to use environment variables, you can access them using the \u003Ccode\u003Eos.environ\u003C\u002Fcode\u003E dictionary provided by Python’s standard library:\u003C\u002Fp\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E os\n\u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E typer\n\napp \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E typer\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003ETyper\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token decorator annotation punctuation\"\u003E@app\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ecommand\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eactivate_shield\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Elevel\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Eint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    \u003Cspan class=\"token triple-quoted-string string\"\u003E\"\"\"\n    Activate Captain America's shield to a specific power level using an environment variable.\n    \"\"\"\u003C\u002Fspan\u003E\n    os\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eenviron\u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"SHIELD_LEVEL\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Estr\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Elevel\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n    typer\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eecho\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string-interpolation\"\u003E\u003Cspan class=\"token string\"\u003Ef\"Shield activated to level \u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E&#123;\u003C\u002Fspan\u003Elevel\u003Cspan class=\"token punctuation\"\u003E&#125;\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E.\"\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E __name__ \u003Cspan class=\"token operator\"\u003E==\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E'__main__'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n    app\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp\u003EIn this example the CLI tool activates Captain America’s shield to a specified power level, demonstrating the use of environment variables. By storing the shield level in an environment variable, the tool illustrates how to use os.environ for managing application state outside the P
205ython process. This can be especially useful for passing information between different parts of an application or to other programs.\u003C\u002Fp\u003E\u003C\u002Fdetails\u003E\n\u003Ch2 id=\"conclusion\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#conclusion\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EConclusion\u003C\u002Fh2\u003E\n\u003Cp\u003ETyper for Python CLI development is a game-changer, offering superhero-like capabilities effortlessly. With Typer, tasks from adding type annotations to managing environment variables become enjoyable. It’s like upgrading your toolset, turning each function into a precision tool. Typer’s accessibility welcomes beginners and experts alike, echoing the Avengers’ unity in the face of challenges. It ensures success in CLI development, empowering developers to leave their mark on the software world. To checkout more and build your own CLI tool you can click here for more detail \u003Ca href=\"https:\u002F\u002Ftyper.tiangolo.com\u002F\" rel=\"nofollow\"\u003ETyper\u003C\u002Fa\u003E.\u003C\u002Fp\u003E",readingTime:"6 min read"}]}},"uses":{"url":1}},null];
206
207					Promise.all([
208						import("./_app/immutable/entry/start.623e9a3d.js"),
209						import("./_app/immutable/entry/app.9894d4fc.js")
210					]).then(([kit, app]) => {
211						kit.start(app, __sveltekit_oy0h6f.element, {
212							node_ids: [0, 2, 11],
213							data,
214							form: null,
215							error: null
216						});
217					});
218				}
219			</script>
219
220		</div>
221	</body>
222</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.