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)-convert-and-move-dalle-images-page.md.5f318a9e.js"> 76 <link rel="modulepreload" href="./_app/immutable/chunks/CodeBlock.08d2e5e0.js"><title>Converting and Moving DALL·E Images with Fish Script - Ted's Tech Chronicles</title><!-- HEAD_svelte-1ylu8nc_START --><meta name="keywords" content="Fish, Shell Script, Image Conversion, Automation, ffmpeg, Svelte, SvelteKit, Blog, Static Site, Web Development, Ted, Tech, Chronicles"> 77 78 <meta name="description" content="Learn how to use a Fish shell script to convert DALL·E-generated images from WebP to JPG and manage them efficiently."> 79 <meta property="og:description" content="Learn how to use a Fish shell script to convert DALL·E-generated images from WebP to JPG and manage them efficiently."> 80 <meta name="twitter:description" content="Learn how to use a Fish shell script to convert DALL·E-generated images from WebP to JPG and manage them efficiently."> 81 <link rel="canonical" href="https://teds-tech-chronicles.netlify.app//convert-and-move-dalle-images"> 82 83 84 <meta property="og:title" content="Converting and Moving DALL·E Images with Fish Script - Ted's Tech Chronicles"> 85 <meta name="twitter:title" content="Converting and Moving DALL·E Images with Fish Script - Ted's Tech Chronicles"> 86 87 <meta property="og:image" content="https://teds-tech-chronicles.netlify.app//images/posts/Conceptual-Workflow.jpg"> 88 <meta name="twitter:image" content="https://teds-tech-chronicles.netlify.app//images/posts/Conceptual-Workflow.jpg"><!-- 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>Converting and Moving DALL·E Images with Fish Script</h1> 112 <div class="note svelte-1hgysft">Published on 08 May 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">Fish</div><div class="tag primary svelte-1xh8qlg">Shell Script</div><div class="tag primary svelte-1xh8qlg">Image Conversion</div><div class="tag primary svelte-1xh8qlg">Automation</div><div class="tag primary svelte-1xh8qlg">ffmpeg</div></div></div> 116 <div class="cover-image svelte-1hgysft"><img srcset="/images/posts/Conceptual-Workflow.avif, /images/posts/Conceptual-Workflow.webp, /images/posts/Conceptual-Workflow.png" src="/images/posts/Conceptual-Workflow.jpg" alt="Converting and Moving DALL·E Images with Fish Script" loading="lazy" decoding="async" class="svelte-1ykl0dj"></div> 117 <div class="content svelte-1hgysft"><h1 id="introduction"><a class="heading-link" title="Permalink" aria-hidden="true" href="#introduction"><span>#</span></a>Introduction</h1> 118<p>Automating repetitive tasks can save a lot of time and effort, especially when dealing with numerous files. The <code>convert_and_move_dalle_images</code> function, written in Fish shell, automates the process of moving DALL·E generated <code>.webp</code> images from the Downloads directory to a designated folder, converting them to <code>.jpg</code> format, and optionally deleting the original <code>.webp</code> files. This post will explain the function step-by-step.</p> 119<h2 id="function-overview"><a class="heading-link" title="Permalink" aria-hidden="true" href="#function-overview"><span>#</span></a>Function Overview</h2> 120<p>The <code>convert_and_move_dalle_images</code> function performs the following tasks:</p> 121<ol><li><strong>Parse arguments</strong>: Checks for a delete flag (<code>-d</code> or <code>--delete</code>).</li> 122<li><strong>Define directories</strong>: Sets up source, destination, and log file paths.</li> 123<li><strong>Ensure directories exist</strong>: Creates the necessary directories if they do not exist.</li> 124<li><strong>Move files</strong>: Moves <code>.webp</code> files from the Downloads folder to the source directory.</li> 125<li><strong>Process files</strong>: Converts <code>.webp</code> files to <code>.jpg</code> format, renames them, and logs the processed files.</li> 126<li><strong>Optional deletion</strong>: Deletes the original <code>.webp</code> files if the delete flag is set.</li></ol> 127<p>Hereâs the complete function (It says bash, but itâs actually fish syntax. Only way I could get the color to work.):</p> 128<div class="code-block svelte-1pkpsrg"> 129 <div class="lang svelte-1pkpsrg">bash</div> 130 <pre class="language-bash"><!-- HTML_TAG_START --><code class="language-bash"><span class="token keyword">function</span> convert_and_move_dalle_images 131 <span class="token comment"># Parse the arguments</span> 132 <span class="token builtin class-name">set</span> delete_flag <span class="token number">0</span> 133 <span class="token keyword">
133for</span> <span class="token for-or-select variable">arg</span> <span class="token keyword">in</span> <span class="token variable">$argv</span> 134 switch <span class="token variable">$arg</span> 135 <span class="token keyword">case</span> <span class="token string">'-d'</span> <span class="token string">'--delete'</span> 136 <span class="token builtin class-name">set</span> delete_flag <span class="token number">1</span> 137 end 138 end 139 140 <span class="token comment"># Store the current directory</span> 141 <span class="token builtin class-name">set</span> original_dir <span class="token punctuation">(</span>pwd<span class="token punctuation">)</span> 142 143 <span class="token comment"># Define the directories</span> 144 <span class="token builtin class-name">set</span> downloads_dir ~/Downloads 145 <span class="token builtin class-name">set</span> src_dir ~/Pictures/ai_generated/webp/ 146 <span class="token builtin class-name">set</span> dst_dir ~/Pictures/ai_generated/jpg/ 147 <span class="token builtin class-name">set</span> log_file <span class="token variable">$src_dir</span>/converted_files.log 148 149 <span class="token comment"># Ensure the source and destination directories exist</span> 150 <span class="token function">mkdir</span> <span class="token parameter variable">-p</span> <span class="token variable">$src_dir</span> 151 <span class="token function">mkdir</span> <span class="token parameter variable">-p</span> <span class="token variable">$dst_dir</span> 152 153 <span class="token comment"># Ensure the log file exists</span> 154 <span class="token function">touch</span> <span class="token variable">$log_file</span> 155 156 <span class="token comment"># Move .webp files from Downloads to the source directory</span> 157 <span class="token keyword">for</span> <span class="token for-or-select variable">file</span> <span class="token keyword">in</span> <span class="token variable">$downloads_dir</span>/*.webp 158 <span class="token keyword">if</span> <span class="token builtin class-name">test</span> <span class="token parameter variable">-f</span> <span class="token variable">$file</span> 159 <span class="token function">mv</span> <span class="token variable">$file</span> <span class="token variable">$src_dir</span> 160 end 161 end 162 163 <span class="token comment"># Change to the source directory</span> 164 <span class="token builtin class-name">cd</span> <span class="token variable">$src_dir</span> 165 166 <span class="token comment"># Loop through all .webp files in the source directory</span> 167 <span class="token keyword">for</span> <span class="token for-or-select variable">file</span> <span class="token keyword">in</span> *.webp 168 <span class="token comment"># Check if the file has already been processed</span> 169 <span class="token keyword">if</span> not <span class="token function">grep</span> <span class="token parameter variable">-q</span> <span class="token variable">$file</span> <span class="token variable">$log_file</span> 170 <span class="token comment"># Extract the base filename without extension</span> 171 <span class="token builtin class-name">set</span> base_filename <span class="token punctuation">(</span>basename <span class="token variable">$file</span> .webp<span class="token punctuation">)</span> 172 173 <span class="token comment"># Remove "DALL·E" from the filename if present</span> 174 <span class="token builtin class-name">set</span> new_filename <span class="token punctuation">(</span>string replace <span class="token parameter variable">-r</span> <span class="token string">"DALL·E"</span> <span class="token string">""</span> <span class="token variable">$base_filename</span><span class="token punctuation">)</span> 175 176 <span class="token comment"># Remove date patterns from the filename</span> 177 <span class="token builtin class-name">set</span> new_filename <span class="token punctuation">(</span>string replace <span class="token parameter variable">-r</span> <span class="token string">"(January|February|March|April|May|June|July|August|September|October|November|December|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)s+d{1,2}"</span> <span class="token string">""</span> <span class="token variable">$new_filename</span><span class="token punctuation">)</span>
178 <span class="token builtin class-name">set</span> new_filename <span class="token punctuation">(</span>string replace <span class="token parameter variable">-r</span> <span class="token string">"d{1,2}/d{1,2}"</span> <span class="token string">""</span> <span class="token variable">$new_filename</span><span class="token punctuation">)</span> 179 180 <span class="token comment"># Trim leading/trailing spaces and hyphens</span> 181 <span class="token builtin class-name">set</span> new_filename <span class="token punctuation">(</span>string trim <span class="token parameter variable">-c</span> <span class="token string">" -"</span> <span class="token variable">$new_filename</span><span class="token punctuation">)</span> 182 183 <span class="token comment"># Replace spaces with dashes</span> 184 <span class="token builtin class-name">set</span> new_filename <span class="token punctuation">(</span>string replace <span class="token parameter variable">-a</span> <span class="token string">" "</span> <span class="token string">"-"</span> <span class="token variable">$new_filename</span><span class="token punctuation">)</span> 185 186 <span class="token comment"># Ensure unique filename</span> 187 <span class="token builtin class-name">set</span> counter <span class="token number">1</span> 188 <span class="token builtin class-name">set</span> final_filename <span class="token variable">$new_filename</span> 189 <span class="token keyword">while</span> <span class="token builtin class-name">test</span> <span class="token parameter variable">-f</span> <span class="token variable">$dst_dir</span><span class="token variable">$final_filename</span>.jpg 190 <span class="token builtin class-name">set</span> final_filename <span class="token variable">$new_filename</span><span class="token string">"_"</span><span class="token variable">$counter</span> 191 <span class="token builtin class-name">set</span> counter <span class="token punctuation">(</span>math <span class="token variable">$counter</span> + <span class="token number">1</span><span class="token punctuation">)</span> 192 end 193 194 <span class="token comment"># Convert the .webp file to .jpg using ffmpeg</span> 195 ffmpeg <span class="token parameter variable">-i</span> <span class="token variable">$file</span> <span class="token parameter variable">-update</span> <span class="token number">1</span> <span class="token parameter variable">-frames:v</span> <span class="token number">1</span> <span class="token variable">$dst_dir</span><span class="token variable">$final_filename</span>.jpg 196 197 <span class="token comment"># Log the processed file</span> 198 <span class="token builtin class-name">echo</span> <span class="token variable">$file</span> <span class="token operator">>></span> <span class="token variable">$log_file</span> 199 200 <span class="token comment"># Delete the original .webp file if the delete flag is set</span> 201 <span class="token keyword">if</span> <span class="token builtin class-name">test</span> <span class="token variable">$delete_flag</span> <span class="token parameter variable">-eq</span> <span class="token number">1</span> 202 <span class="token function">rm</span> <span class="token variable">$file</span> 203 end 204 end 205 end 206 207 <span class="token comment"># Change back to the original directory</span> 208 <span class="token builtin class-name">cd</span> <span class="token variable">$original_dir</span> 209end</code><!-- HTML_TAG_END --></pre> 210</div> 211<h2 id="detailed-breakdown"><a class="heading-link" title="Permalink" aria-hidden="true" href="#detailed-breakdown"><span>#</span></a>Detailed Breakdown</h2> 212<h3 id="argument-parsing"><a class="heading-link" title="Permalink" aria-hidden="true" href="#argument-parsing"><span>#</span></a>Argument Parsing</h3> 213<p>The function first checks if a <code>-d</code> or <code>--delete</code> argument is provided to determine if the original <code>.webp</code> files should be deleted after conversion.</p> 214<h3 id="directory-setup"><a class="heading-link" title="Permalink" aria-hidden="true" href="#directory-setup"><span>#</span></a>Directory Setup</h3> 215<p>It defines and ensures the existence of the following directories and files:</p> 216<ul><li><code>downloads_dir</code>: Where the <code>.webp</code> files are initially located.</li> 217<li><code>src_dir</code>: The source directory for processing files.</li> 218<li><code>dst_dir</code>: The destination directory for the converted <code>.jpg</code> files.</li> 219<li><code>log_file</code>: A log file to track processed files.</li></ul> 220<h3 id="moving-and-processing-files"><a class="heading-link" title="Permalink" aria-hidden="true" href="#moving-and-processing-files"><span>#</span></a>Moving and Processing Files</h3> 221<ol><li><strong>Move <code>.webp</code> files</strong>: All <code>.webp</code> files from the Downloads folder are moved to the source directory.</li> 222<li><strong>Convert and Rename</strong>:<ul><li>Removes âDALL·Eâ and date patterns from filenames.</li> 223<li>Trims spaces and hyphens.</li> 224<li>Replaces spaces with dashes.</li> 225<li>Ensures unique filenames to avoid overwriting.</li> 226<li>Converts the files using <code>ffmpeg</code>.</li></ul></li> 227<li><strong>Logging</strong>: Logs processed files to prevent reprocessing.</li> 228<li><strong>
228Optional Deletion</strong>: Deletes original <code>.webp</code> files if the delete flag is set.</li></ol> 229<h3 id="conclusion"><a class="heading-link" title="Permalink" aria-hidden="true" href="#conclusion"><span>#</span></a>Conclusion</h3> 230<p>This function simplifies managing and converting your DALL·E generated images, ensuring they are well-organized and consistently named. By automating these tasks, you can focus more on creativity and less on file management. Feel free to customize the function to fit your specific needs and workflow.</p></div></article> 231 <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> 232 </div> 233 </div> 234 <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> 235 <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> 236 <div class="note svelte-1i7t6gt">12 min read</div> 237 <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> 238 <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> 239</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> 240 <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> 241 <div class="note svelte-1i7t6gt">5 min read</div> 242 <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> 243 <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> 244</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> 245 <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> 246 <div class="note svelte-1i7t6gt">6 min read</div> 247 <p class="text svelte-1i7t6gt">Discover the key features of Typer for creating command line interfaces in Python.</p></div></div> 248 <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> 249</a></div></div> 250</section></div></main> 251 <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> 252 <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 253 <a href="https://iconoir.com/" target="_blank" rel="noopener noreferrer" class="svelte-1m94jhe">Iconoir</a>. 254 </div> 255 <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 256 M40,25 l45,20 -45,20 z" fill="none" stroke="currentColor" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"></path></svg></a> 257 258 <a href="https://github.com/Tedfulk" target="_blank" rel="noopener noreferrer" title="See my GitHub profile" class="svelte-t4kqcq">
258<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> 259 <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> 260 <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> 261</div> 262 263 <noscript> 264 <style>.theme-toggle { 265 display: none !important; 266 } 267 </style></noscript> 268<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> 269 <span class="label svelte-niuf71">Auto</span> 270</button></div></div> 271</footer> 272</div> 273 274 275
275<script> 276 { 277 __sveltekit_oy0h6f = { 278 env: {}, 279 base: new URL(".", location).pathname.slice(0, -1), 280 element: document.currentScript.parentElement 281 }; 282 283 const data = [null,{"type":"data","data":{post:{slug:"convert-and-move-dalle-images",title:"Converting and Moving DALL·E Images with Fish Script",date:"2024-05-08T00:00:00.000Z",excerpt:"Learn how to use a Fish shell script to convert DALL·E-generated images from WebP to JPG and manage them efficiently.",coverImage:"\u002Fimages\u002Fposts\u002FConceptual-Workflow.jpg",tags:["Fish","Shell Script","Image Conversion","Automation","ffmpeg"],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\u003EAutomating repetitive tasks can save a lot of time and effort, especially when dealing with numerous files. The \u003Ccode\u003Econvert_and_move_dalle_images\u003C\u002Fcode\u003E function, written in Fish shell, automates the process of moving DALL·E generated \u003Ccode\u003E.webp\u003C\u002Fcode\u003E images from the Downloads directory to a designated folder, converting them to \u003Ccode\u003E.jpg\u003C\u002Fcode\u003E format, and optionally deleting the original \u003Ccode\u003E.webp\u003C\u002Fcode\u003E files. This post will explain the function step-by-step.\u003C\u002Fp\u003E\n\u003Ch2 id=\"function-overview\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#function-overview\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EFunction Overview\u003C\u002Fh2\u003E\n\u003Cp\u003EThe \u003Ccode\u003Econvert_and_move_dalle_images\u003C\u002Fcode\u003E function performs the following tasks:\u003C\u002Fp\u003E\n\u003Col\u003E\u003Cli\u003E\u003Cstrong\u003EParse arguments\u003C\u002Fstrong\u003E: Checks for a delete flag (\u003Ccode\u003E-d\u003C\u002Fcode\u003E or \u003Ccode\u003E--delete\u003C\u002Fcode\u003E).\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EDefine directories\u003C\u002Fstrong\u003E: Sets up source, destination, and log file paths.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EEnsure directories exist\u003C\u002Fstrong\u003E: Creates the necessary directories if they do not exist.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EMove files\u003C\u002Fstrong\u003E: Moves \u003Ccode\u003E.webp\u003C\u002Fcode\u003E files from the Downloads folder to the source directory.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EProcess files\u003C\u002Fstrong\u003E: Converts \u003Ccode\u003E.webp\u003C\u002Fcode\u003E files to \u003Ccode\u003E.jpg\u003C\u002Fcode\u003E format, renames them, and logs the processed files.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EOptional deletion\u003C\u002Fstrong\u003E: Deletes the original \u003Ccode\u003E.webp\u003C\u002Fcode\u003E files if the delete flag is set.\u003C\u002Fli\u003E\u003C\u002Fol\u003E\n\u003Cp\u003EHereâs the complete function (It says bash, but itâs actually fish syntax. Only way I could get the color to work.):\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\"\u003E\u003Cspan class=\"token keyword\"\u003Efunction\u003C\u002Fspan\u003E convert_and_move_dalle_images\n \u003Cspan class=\"token comment\"\u003E# Parse the arguments\u003C\u002Fspan\u003E\n \u003Cspan class=\"token builtin class-name\"\u003Eset\u003C\u002Fspan\u003E delete_flag \u003Cspan class=\"token number\"\u003E0\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Efor\u003C\u002Fspan\u003E \u003Cspan class=\"token for-or-select variable\"\u003Earg\u003C\u002Fspan\u003E \u003Cspan class=\"token keyword\"\u003Ein\u003C\u002Fspan\u003E \u003Cspan class=\"token variable\"\u003E$argv\u003C\u002Fspan\u003E\n switch \u003Cspan class=\"token variable\"\u003E$arg\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Ecase\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E'-d'\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E'--delete'\u003C\u002Fspan\u003E\n \u003Cspan class=\"token builtin class-name\"\u003Eset\u003C\u002Fspan\u003E delete_flag \u003Cspan class=\"token number\"\u003E1\u003C\u002Fspan\u003E\n end\n end\n\n \u003Cspan class=\"token comment\"\u003E# Store the current directory\u003C\u002Fspan\u003E\n \u003Cspan class=\"token builtin class-name\"\u003Eset\u003C\u002Fspan\u003E original_dir \u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Epwd\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token comment\"\u003E# Define the directories\u003C\u002Fspan\u003E\n \u003Cspan class=\"token builtin class-name\"\u003Eset\u003C\u002Fspan\u003E downloads_dir ~\u002FDownloads\n \u003Cspan class=\"token builtin class-name\"\u003Eset\u003C\u002Fspan\u003E src_dir ~\u002FPictures\u002Fai_generated\u002Fwebp\u002F\n \u003Cspan class=\"token builtin class-name\"\u003Eset\u003C\u002Fspan\u003E dst_dir ~\u002FPictures\u002Fai_generated\u002Fjpg\u002F\n \u003Cspan class=\"token builtin class-name\"\u003Eset\u003C\u002Fspan\u003E log_file \u003Cspan class=\"token variable\"\u003E$src_dir\u003C\u002Fspan\u003E\u002Fconverted_files.log\n\n \u003Cspan class=\"token comment\"\u003E# Ensure the source and destination directories exist\u003C\u002Fspan\u003E\n \u003Cspan class=\"token function\"\u003Emkdir\u003C\u002Fspan\u003E \u003Cspan class=\"token parameter variable\"\u003E-p\u003C\u002Fspan\u003E \u003Cspan class=\"token variable\"\u003E$src_dir\u003C\u002Fspan\u003E\n \u003Cspan class=\"token function\"\u003Emkdir\u003C\u002Fspan\u003E \u003Cspan class=\"token parameter variable\"\u003E-p\u003C\u002Fspan\u003E \u003Cspan class=\"token variable\"\u003E$dst_dir\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token comment\"\u003E# Ensure the log file exists\u003C\u002Fspan\u003E\n \u003Cspan class=\"token function\"\u003Etouch\u003C\u002Fspan\u003E \u003Cspan class=\"token variable\"\u003E$log_file\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token comment\"\u003E# Move .webp files from Downloads to the source directory\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Efor\u003C\u002Fspan\u003E \u003Cspan class=\"token for-or-select variable\"\u003Efile\u003C\u002Fspan\u003E \u003Cspan class=\"token keyword\"\u003Ein\u003C\u002Fspan\u003E \u003Cspan class=\"token variable\"\u003E$downloads_dir\u003C\u002Fspan\u003E\u002F*.webp\n \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin class-name\"\u003Etest\u003C\u002Fspan\u003E \u003Cspan class=\"token parameter variable\"\u003E-f\u003C\u002Fspan\u003E \u003Cspan class=\"token variable\"\u003E$file\u003C\u002Fspan\u003E\n \u003Cspan class=\"token function\"\u003Emv\u003C\u002Fspan\u003E \u003Cspan class=\"token variable\"\u003E$file\u003C\u002Fspan\u003E \u003Cspan class=\"token variable\"\u003E$src_dir\u003C\u002Fspan\u003E\n end\n end\n\n \u003Cspan class=\"token comment\"\u003E# Change to the source directory\u003C\u002Fspan\u003E\n \u003Cspan class=\"token builtin class-name\"\u003Ecd\u003C\u002Fspan\u003E \u003Cspan class=\"token variable\"\u003E$src_dir\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token comment\"\u003E# Loop through all .webp files in the source directory\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Efor\u003C\u002Fspan\u003E \u003Cspan class=\"token for-or-select variable\"\u003Efile\u003C\u002Fspan\u003E \u003Cspan class=\"token keyword\"\u003Ein\u003C\u002Fspan\u003E *.webp\n \u003Cspan class=\"token comment\"\u003E# Check if the file has already been processed\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E not \u003Cspan class=\"token function\"\u003Egrep\u003C\u002Fspan\u003E \u003Cspan class=\"token parameter variable\"\u003E-q\u003C\u002Fspan\u003E \u003Cspan class=\"token variable\"\u003E$file\u003C\u002Fspan\u003E \u003Cspan class=\"token variable\"\u003E$log_file\u003C\u002Fspan\u003E\n \u003Cspan class=\"token comment\"\u003E# Extract the base filename without extension\u003C\u002Fspan\u003E\n \u003Cspan class=\"token builtin class-name\"\u003Eset\u003C\u002Fspan\u003E base_filename \u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Ebasename \u003Cspan class=\"token variable\"\u003E$file\u003C\u002Fspan\u003E .webp\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token comment\"\u003E# Remove \"DALL·E\" from the filename if present\u003C\u002Fspan\u003E\n \u003Cspan class=\"token builtin class-name\"\u003Eset\u003C\u002Fspan\u003E new_filename \u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Estring replace \u003Cspan class=\"token parameter variable\"\u003E-r\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"DALL·E\"\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"\"\u003C\u002Fspan\u003E \u003Cspan class=\"token variable\"\u003E$base_filename\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token comment\"\u003E# Remove date patterns from the filename\u003C\u002Fspan\u003E\n \u003Cspan class=\"token builtin class-name\"\u003Eset\u003C\u002Fspan\u003E new_filename \u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Estring replace \u003Cspan class=\"token parameter variable\"\u003E-r\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"(January|February|March|April|May|June|July|August|September|October|November|December|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)s+d{1,2}\"\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"\"\u003C\u002Fspan\u003E \u003Cspan class=\"token variable\"\u003E$new_filename\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n \u003Cspan class=\"token builtin class-name\"\u003Eset\u003C\u002Fspan\u003E new_filename \u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Estring replace \u003Cspan class=\"token parameter variable\"\u003E-r\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"d{1,2}\u002Fd{1,2}\"\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"\"\u003C\u002Fspan\u003E \u003Cspan class=\"token variable\"\u003E$new_filename\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token comment\"\u003E# Trim leading\u002Ftrailing space
283s and hyphens\u003C\u002Fspan\u003E\n \u003Cspan class=\"token builtin class-name\"\u003Eset\u003C\u002Fspan\u003E new_filename \u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Estring trim \u003Cspan class=\"token parameter variable\"\u003E-c\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\" -\"\u003C\u002Fspan\u003E \u003Cspan class=\"token variable\"\u003E$new_filename\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token comment\"\u003E# Replace spaces with dashes\u003C\u002Fspan\u003E\n \u003Cspan class=\"token builtin class-name\"\u003Eset\u003C\u002Fspan\u003E new_filename \u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Estring replace \u003Cspan class=\"token parameter variable\"\u003E-a\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\" \"\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"-\"\u003C\u002Fspan\u003E \u003Cspan class=\"token variable\"\u003E$new_filename\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token comment\"\u003E# Ensure unique filename\u003C\u002Fspan\u003E\n \u003Cspan class=\"token builtin class-name\"\u003Eset\u003C\u002Fspan\u003E counter \u003Cspan class=\"token number\"\u003E1\u003C\u002Fspan\u003E\n \u003Cspan class=\"token builtin class-name\"\u003Eset\u003C\u002Fspan\u003E final_filename \u003Cspan class=\"token variable\"\u003E$new_filename\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Ewhile\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin class-name\"\u003Etest\u003C\u002Fspan\u003E \u003Cspan class=\"token parameter variable\"\u003E-f\u003C\u002Fspan\u003E \u003Cspan class=\"token variable\"\u003E$dst_dir\u003C\u002Fspan\u003E\u003Cspan class=\"token variable\"\u003E$final_filename\u003C\u002Fspan\u003E.jpg\n \u003Cspan class=\"token builtin class-name\"\u003Eset\u003C\u002Fspan\u003E final_filename \u003Cspan class=\"token variable\"\u003E$new_filename\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"_\"\u003C\u002Fspan\u003E\u003Cspan class=\"token variable\"\u003E$counter\u003C\u002Fspan\u003E\n \u003Cspan class=\"token builtin class-name\"\u003Eset\u003C\u002Fspan\u003E counter \u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Emath \u003Cspan class=\"token variable\"\u003E$counter\u003C\u002Fspan\u003E + \u003Cspan class=\"token number\"\u003E1\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n end\n\n \u003Cspan class=\"token comment\"\u003E# Convert the .webp file to .jpg using ffmpeg\u003C\u002Fspan\u003E\n ffmpeg \u003Cspan class=\"token parameter variable\"\u003E-i\u003C\u002Fspan\u003E \u003Cspan class=\"token variable\"\u003E$file\u003C\u002Fspan\u003E \u003Cspan class=\"token parameter variable\"\u003E-update\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E1\u003C\u002Fspan\u003E \u003Cspan class=\"token parameter variable\"\u003E-frames:v\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E1\u003C\u002Fspan\u003E \u003Cspan class=\"token variable\"\u003E$dst_dir\u003C\u002Fspan\u003E\u003Cspan class=\"token variable\"\u003E$final_filename\u003C\u002Fspan\u003E.jpg\n\n \u003Cspan class=\"token comment\"\u003E# Log the processed file\u003C\u002Fspan\u003E\n \u003Cspan class=\"token builtin class-name\"\u003Eecho\u003C\u002Fspan\u003E \u003Cspan class=\"token variable\"\u003E$file\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E\u003E\u003E\u003C\u002Fspan\u003E \u003Cspan class=\"token variable\"\u003E$log_file\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token comment\"\u003E# Delete the original .webp file if the delete flag is set\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin class-name\"\u003Etest\u003C\u002Fspan\u003E \u003Cspan class=\"token variable\"\u003E$delete_flag\u003C\u002Fspan\u003E \u003Cspan class=\"token parameter variable\"\u003E-eq\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E1\u003C\u002Fspan\u003E\n \u003Cspan class=\"token function\"\u003Erm\u003C\u002Fspan\u003E \u003Cspan class=\"token variable\"\u003E$file\u003C\u002Fspan\u003E\n end\n end\n end\n\n \u003Cspan class=\"token comment\"\u003E# Change back to the original directory\u003C\u002Fspan\u003E\n \u003Cspan class=\"token builtin class-name\"\u003Ecd\u003C\u002Fspan\u003E \u003Cspan class=\"token variable\"\u003E$original_dir\u003C\u002Fspan\u003E\nend\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Ch2 id=\"detailed-breakdown\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#detailed-breakdown\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EDetailed Breakdown\u003C\u002Fh2\u003E\n\u003Ch3 id=\"argument-parsing\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#argument-parsing\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EArgument Parsing\u003C\u002Fh3\u003E\n\u003Cp\u003EThe function first checks if a \u003Ccode\u003E-d\u003C\u002Fcode\u003E or \u003Ccode\u003E--delete\u003C\u002Fcode\u003E argument is provided to determine if the original \u003Ccode\u003E.webp\u003C\u002Fcode\u003E files should be deleted after conversion.\u003C\u002Fp\u003E\n\u003Ch3 id=\"directory-setup\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#directory-setup\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EDirectory Setup\u003C\u002Fh3\u003E\n\u003Cp\u003EIt defines and ensures the existence of the following directories and files:\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Ccode\u003Edownloads_dir\u003C\u002Fcode\u003E: Where the \u003Ccode\u003E.webp\u003C\u002Fcode\u003E files are initially located.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ccode\u003Esrc_dir\u003C\u002Fcode\u003E: The source directory for processing files.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ccode\u003Edst_dir\u003C\u002Fcode\u003E: The destination directory for the converted \u003Ccode\u003E.jpg\u003C\u002Fcode\u003E files.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ccode\u003Elog_file\u003C\u002Fcode\u003E: A log file to track processed files.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"moving-and-processing-files\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#moving-and-processing-files\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EMoving and Processing Files\u003C\u002Fh3\u003E\n\u003Col\u003E\u003Cli\u003E\u003Cstrong\u003EMove \u003Ccode\u003E.webp\u003C\u002Fcode\u003E files\u003C\u002Fstrong\u003E: All \u003Ccode\u003E.webp\u003C\u002Fcode\u003E files from the Downloads folder are moved to the source directory.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EConvert and Rename\u003C\u002Fstrong\u003E:\u003Cul\u003E\u003Cli\u003ERemoves âDALL·Eâ and date patterns from filenames.\u003C\u002Fli\u003E\n\u003Cli\u003ETrims spaces and hyphens.\u003C\u002Fli\u003E\n\u003Cli\u003EReplaces spaces with dashes.\u003C\u002Fli\u003E\n\u003Cli\u003EEnsures unique filenames to avoid overwriting.\u003C\u002Fli\u003E\n\u003Cli\u003EConverts the files using \u003Ccode\u003Effmpeg\u003C\u002Fcode\u003E.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ELogging\u003C\u002Fstrong\u003E: Logs processed files to prevent reprocessing.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EOptional Deleti
283on\u003C\u002Fstrong\u003E: Deletes original \u003Ccode\u003E.webp\u003C\u002Fcode\u003E files if the delete flag is set.\u003C\u002Fli\u003E\u003C\u002Fol\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\u003EThis function simplifies managing and converting your DALL·E generated images, ensuring they are well-organized and consistently named. By automating these tasks, you can focus more on creativity and less on file management. Feel free to customize the function to fit your specific needs and workflow.\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 code 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{\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}\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{\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}\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\u003Cl
283i\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.\u003C\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_
283_\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\"\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
283 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\u002Fspan\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{\u003C\u002Fspan\u003Esubject\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Estate\u003Cspan class=\"token punctuation\"\u003E}\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\u002Fs
283pan\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\u003Cspan 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
283ommunication\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
283ollections 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
283ion\"\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{\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_payload\u003Cspan class=\"token punctuation\"\u003E}\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{\u003C\u002Fspan\u003Ea\u003Cspan class=\"token punctuation\"\u003E}\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{\u003C\u002Fspan\u003Eb\u003Cspan class=\"token punctuation\"\u003E}\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
283003Cspan 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
283003Cspan 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
283ode 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
283pi_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
283003C\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
283pi_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{\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}\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{\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}\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
283003C\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{\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}\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
283pi_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
283pi_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{\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}\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
283003C\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{\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}\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
283003C\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{\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}\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
283ntly. 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 & 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 & 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{\u003C\u002Fspan\u003Ehero\u003Cspan class=\"token punctuation\"\u003E}\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{\u003C\u002Fspan\u003Epower\u003Cspan class=\"token punctuation\"\u003E}\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
283s\u003E\n\u003Cdetails\u003E\u003Csummary\u003E\u003Cb\u003ECallbacks & 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
283s\u003E\n\u003Cdetails\u003E\u003Csummary\u003E\u003Cb\u003EOptional & 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{\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}\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{\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}\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{\u003C\u002Fspan\u003Estatus\u003Cspan class=\"token punctuation\"\u003E}\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
283s\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
283shield,â 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{\u003C\u002Fspan\u003Elevel\u003Cspan class=\"token punctuation\"\u003E}\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
283ython 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]; 284 285 Promise.all([ 286 import("./_app/immutable/entry/start.623e9a3d.js"), 287 import("./_app/immutable/entry/app.9894d4fc.js") 288 ]).then(([kit, app]) => { 289 kit.start(app, __sveltekit_oy0h6f.element, { 290 node_ids: [0, 2, 7], 291 data, 292 form: null, 293 error: null 294 }); 295 }); 296 } 297 </script>
297 298 </div> 299 </body> 300</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.