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.4c4b0438.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/_page.b646de84.css" rel="stylesheet"> 60 <link href="./_app/immutable/assets/Button.7dba5869.css" rel="stylesheet"> 61 <link href="./_app/immutable/assets/ContentSection.3fd00a97.css" rel="stylesheet"> 62 <link rel="modulepreload" href="./_app/immutable/entry/start.623e9a3d.js"> 63 <link rel="modulepreload" href="./_app/immutable/chunks/index.51348c94.js"> 64 <link rel="modulepreload" href="./_app/immutable/chunks/index.80ea3461.js"> 65 <link rel="modulepreload" href="./_app/immutable/entry/app.9894d4fc.js"> 66 <link rel="modulepreload" href="./_app/immutable/entry/_layout.svelte.c68b2ca6.js"> 67 <link rel="modulepreload" href="./_app/immutable/entry/_layout.ts.984db11e.js"> 68 <link rel="modulepreload" href="./_app/immutable/chunks/_layout.da46b06b.js"> 69 <link rel="modulepreload" href="./_app/immutable/entry/(waves)-layout.svelte.b656bf08.js"> 70 <link rel="modulepreload" href="./_app/immutable/chunks/Footer.da5c817c.js"> 71 <link rel="modulepreload" href="./_app/immutable/chunks/Image.37c8e6c5.js"> 72 <link rel="modulepreload" href="./_app/immutable/chunks/Socials.9a0e651d.js"> 73 <link rel="modulepreload" href="./_app/immutable/chunks/meta.0a6c6a0c.js"> 74 <link rel="modulepreload" href="./_app/immutable/entry/(waves)-page.svelte.cf44d08a.js"> 75 <link rel="modulepreload" href="./_app/immutable/chunks/Button.acdbecb4.js"> 76 <link rel="modulepreload" href="./_app/immutable/chunks/regex.7dfa9b23.js"> 77 <link rel="modulepreload" href="./_app/immutable/chunks/ContentSection.a6902dd1.js"><title>Ted's Tech Chronicles</title><!-- HEAD_svelte-12ekxku_START --><link rel="âcanonicalâ" href="https://teds-tech-chronicles.netlify.app/"><meta name="keywords" content="Svelte, SvelteKit, Blog, Static Site, Web Development, Ted, Tech, Chronicles"><meta name="description" content="A blog about my journey through the world of web development."><meta property="og:description" content="A blog about my journey through the world of web development."><meta name="twitter:description" content="A blog about my journey through the world of web development."><meta property="og:title" content="Ted's Tech Chronicles"><meta name="twitter:title" content="Ted's Tech Chronicles"><meta property="og:image" content="https://teds-tech-chronicles.netlify.app//images/site-preview.png"><meta name="twitter:image" content="https://teds-tech-chronicles.netlify.app//images/site-preview.png"><meta name="twitter:card" content="summary_large_image"><!-- HEAD_svelte-12ekxku_END --> 78 </head> 79 <body data-sveltekit-preload-data="hover"> 80 <div id="svelte-root"> 81 82 83 84<div class="waves-container svelte-of6vnk"><svg class="waves svelte-of6vnk" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 24 150 28" preserveAspectRatio="none" shape-rendering="auto"><defs><path id="gentle-wave" d="M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z"></path></defs><g class="parallax svelte-of6vnk"><use xlink:href="#gentle-wave" x="48" y="0" fill="rgba(var(--color--page-background-rgb),0.7)" class="svelte-of6vnk"></use><use xlink:href="#gentle-wave" x="48" y="3" fill="rgba(var(--color--page-background-rgb),0.5)" class="svelte-of6vnk"></use><use xlink:href="#gentle-wave" x="48" y="5" fill="rgba(var(--color--page-background-rgb),0.3)" class="svelte-of6vnk"></use><use xlink:href="#gentle-wave" x="48" y="7" fill="var(--color--page-background)" class="svelte-of6vnk"></use></g></svg></div> 85<header class="svelte-ymh1wh"><nav class="container svelte-ymh1wh"><a class="logo-icon svelte-ymh1wh" href="/" aria-label="Ted Fulk Icon"> 86<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"> 87</div></a> 88 <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> 89</div></a>
90 <div class="links svelte-ymh1wh"><a href="/blog" class="svelte-ymh1wh">Blog</a> 91 92 <noscript> 93 <style>.theme-toggle { 94 display: none !important; 95 } 96 </style></noscript> 97<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> 98 <span class="label svelte-niuf71">Auto</span> 99</button></div></nav> 100</header> 101<main><div class="container"><section id="hero" class="svelte-4lc4vd"><h1 class="hello svelte-4lc4vd">Ted's Tech <div class="sparkle-wrapper svelte-exdx8u"> 102 <span class="slot-wrapper svelte-exdx8u"><strong class="primary svelte-8f8x6d">Chronicles!</strong></span> 103</div></h1> 104 <p class="intro svelte-4lc4vd"><span class="left svelte-4lc4vd">"Clean code always looks like it was written by someone who cares." </span> 105 <span class="right svelte-4lc4vd">â Robert C. Martin</span></p> 106 <div class="ctas svelte-4lc4vd"><div class="sparkle-wrapper svelte-exdx8u"> 107 <span class="slot-wrapper svelte-exdx8u"><a href="https://github.com/Tedfulk/" target="_blank" rel="noopener noreferrer" class="button style--understated size--medium color--secondary svelte-6zxw49" data-sveltekit-preload-data><div class="icon svelte-6zxw49"><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></div> 108 GitHub 109 110</a></span> 111</div></div> 112</section> 113 <section id="about" class="svelte-6pq5ml"><div class="info svelte-6pq5ml"> 114 115 <p class="svelte-6pq5ml">Welcome to a curated space where technology meets practicality. Here, I explore into the latest advancements and offer insights into the tools and tech that power our digital world. 116 <br> 117 <br> 118 From in-depth articles on Python's newest libraries to exploring the backbone of robust backend systems, and the ever-evolving landscape of web development - this is your go-to source for tech that matters. Join me on this journey as we dissect news articles, analyze informative YouTube videos, and explore the potentials of AI. 119 </p> 120 <div class="socials svelte-6pq5ml"><span class="svelte-6pq5ml">Socials:</span> 121 <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 122 M40,25 l45,20 -45,20 z" fill="none" stroke="currentColor" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"></path></svg></a> 123 124 <a href="https://github.com/Tedfulk" target="_blank" rel="noopener noreferrer" title="See my GitHub profile" class="svelte-t4kqcq">
124<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> 125 <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> 126 <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> 127</div></div></div> 128 <div class="image svelte-6pq5ml"><img srcset="/images/fresh-idea-1.avif, /images/fresh-idea-1.webp, /images/fresh-idea-1.png" src="/images/fresh-idea-1.png" alt="Sample for the static template" loading="lazy" decoding="async" class="svelte-1ykl0dj"></div> 129</section> 130 <section id="recent-posts" class="content-section left svelte-emrvls"><div class="title-area svelte-emrvls"><div class="text svelte-emrvls"><h2>Blog posts</h2> 131 <p>Click on the button below to view all blog posts</p></div> 132 <div class="button"><div slot="button"><a href="/blog" target="_self" class="button style--understated size--medium color--secondary svelte-6zxw49" data-sveltekit-preload-data> 133 View More 134</a></div></div></div> 135 <div class="content-area svelte-emrvls"><div class="grid svelte-1hdv5ie"><a class='card blog-post-card no-image svelte-1kz16cj' data-sveltekit-preload-data href='/introducing-fasthtml' target='_self'><div class="image svelte-1kz16cj"><div class="image" slot="image"></div></div> 136 <div class="body svelte-1kz16cj"><div class="content svelte-1kz16cj"><div class="content svelte-1i7t6gt" slot="content"><p class="title svelte-1i7t6gt">Introducing FastHtml</p> 137 <div class="note svelte-1i7t6gt">4 min read</div> 138 <p class="text svelte-1i7t6gt">FastHtml is a new Python-based web framework that streamlines the process of building dynamic web applications by minimizing the need for JavaScript, perfect for quick dashboards, prototypes, and interactive reports.</p></div></div> 139 <div class="footer"><div class="footer svelte-1i7t6gt" slot="footer"><div class="tags svelte-1i7t6gt"><div class="tag primary svelte-1xh8qlg">Web Development</div><div class="tag primary svelte-1xh8qlg">Python</div></div></div></div></div> 140</a><a class="card blog-post-card no-image svelte-1kz16cj" href="/convert-and-move-dalle-images" target="_self" data-sveltekit-preload-data><div class="image svelte-1kz16cj"><div class="image" slot="image"></div></div> 141 <div class="body svelte-1kz16cj"><div class="content svelte-1kz16cj"><div class="content svelte-1i7t6gt" slot="content"><p class="title svelte-1i7t6gt">Converting and Moving DALL·E Images with Fish Script</p> 142 <div class="note svelte-1i7t6gt">4 min read</div> 143 <p class="text svelte-1i7t6gt">Learn how to use a Fish shell script to convert DALL·E-generated images from WebP to JPG and manage them efficiently.</p></div></div> 144 <div class="footer"><div class="footer svelte-1i7t6gt" slot="footer"><div class="tags svelte-1i7t6gt"><div class="tag primary svelte-1xh8qlg">Fish</div><div class="tag primary svelte-1xh8qlg">Shell Script</div></div></div></div></div> 145</a><a class="card blog-post-card no-image svelte-1kz16cj" href="/exploring-ollama-library" target="_self" data-sveltekit-preload-data><div class="image svelte-1kz16cj"><div class="image" slot="image"></div></div> 146 <div class="body svelte-1kz16cj"><div class="content svelte-1kz16cj"><div class="content svelte-1i7t6gt" slot="content"><p class="title svelte-1i7t6gt">Exploring the Ollama Library Top Models and Their Applications</p> 147 <div class="note svelte-1i7t6gt">7 min read</div> 148 <p class="text svelte-1i7t6gt">Discover the top models in the Ollama Library, their strengths, weaknesses, and potential use cases. Learn how to choose the best model for your needs.</p></div></div> 149 <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">Machine Learning</div></div></div></div></div> 150</a><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> 151 <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> 152 <div class="note svelte-1i7t6gt">12 min read</div> 153 <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> 154 <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> 155</a></div></div> 156</section> 157 </div></main> 158<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> 159 <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 160 <a href="https://iconoir.com/" target="_blank" rel="noopener noreferrer" class="svelte-1m94jhe">Iconoir</a>. 161 </div> 162 <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 163 M40,25 l45,20 -45,20 z" fill="none" stroke="currentColor" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"></path></svg></a> 164 165 <a href="https://github.com/Tedfulk" target="_blank" rel="noopener noreferrer" title="See my GitHub profile" class="svelte-t4kqcq">
165<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> 166 <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> 167 <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> 168</div> 169 170 <noscript> 171 <style>.theme-toggle { 172 display: none !important; 173 } 174 </style></noscript> 175<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> 176 <span class="label svelte-niuf71">Auto</span> 177</button></div></div> 178</footer> 179 180 181
181<script> 182 { 183 __sveltekit_oy0h6f = { 184 env: {}, 185 base: new URL(".", location).pathname.slice(0, -1), 186 element: document.currentScript.parentElement 187 }; 188 189 const data = [null,null,{"type":"data","data":(function(a,b,c){a[0]="Design Patterns";a[1]="Software Development";a[2]="Programming";a[3]="Python";a[4]="Tutorial";b[0]="AI";b[1]="Voice Assistant";b[2]="Python";b[3]="Programming";b[4]="Assembly AI";b[5]="Groq";b[6]="ElevenLabs";c[0]="Python";c[1]="CLI tools";c[2]="Typer";return {features:[{name:"Markdown Support",description:"Blog posts are written in Markdown, a simple and nearly-universal format. This means you can bring over your posts from other platforms, and easily export to another if you want to.",image:"images\u002Ffeatures\u002Fmarkdown.jpg",tags:[{label:"Powered by MDsveX"}]},{name:"Themeable",description:"You can easily theme the entire website by changing just a few colors in the _themes.scss file.",image:"images\u002Ffeatures\u002Fthemeable.jpg",tags:[{label:"Primary Color"},{label:"Secondary Color",color:"secondary"}]},{name:"Extensible",description:"Components are built to be reused, and you can build new pages and layouts without much CSS knowledge. You can see all components in Histoire by running \"npm run story:dev\"",image:"images\u002Ffeatures\u002Fextensible.jpg"},{name:"Well Optimized",description:"Images are automatically optimized and lazy loaded, to ensure the website loads as fast as possible regardless of connection speed.",image:"images\u002Ffeatures\u002Foptimized.jpg",tags:[{label:"Powered by Image Transmutation"}]},{name:"Light and Dark Modes",description:"This template was built with dark mode in mind. It can swap between themes automatically (based on system settings) or manually. Both themes can be tweaked in the _themes.scss file.",image:"images\u002Ffeatures\u002Flight-dark.jpg"},{name:"Open Source",description:"All code is open source, which means you can copy and modify it to your heart's content. All I ask is that you make your code open too so that knowledge can be passed on.",image:"images\u002Ffeatures\u002Fopen-source.jpg"}],posts:[{slug:"introducing-fasthtml",title:"Introducing FastHtml",date:"2024-08-15T12:00:00.000Z",excerpt:"FastHtml is a new Python-based web framework that streamlines the process of building dynamic web applications by minimizing the need for JavaScript, perfect for quick dashboards, prototypes, and interactive reports.",coverImage:"\u002Fimages\u002Fposts\u002Ffasthtml-cover.png",tags:["Web Development","Python","FastHtml","HTMX","FastAPI"],html:"\u003Ch3 id=\"introduction\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#introduction\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EIntroduction\u003C\u002Fh3\u003E\n\u003Cp\u003EIf youâre into web development, you might be familiar with the complexities that come with using frameworks like Django or Flask. These frameworks are powerful but often require a lot of boilerplate code, especially when setting up even simple projects. This can be frustrating if you just want to get something up and running quickly, without the hassle of managing models, views, templates.\u003C\u002Fp\u003E\n\u003Cp\u003EThis is where \u003Cstrong\u003EFastHtml\u003C\u002Fstrong\u003E steps in. FastHtml is a relatively new web development framework that simplifies the process of building dynamic web applications. Itâs designed for developers who want to use Python to handle both the backend and frontend without needing to dive deep into JavaScript. For instance, if youâre creating a quick dashboard, a prototype, or an interactive report, FastHtml makes it easy to get your project off the ground with minimal setup.\u003C\u002Fp\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Easync\u003C\u002Fspan\u003E \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eweather_table\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token triple-quoted-string string\"\u003E\"\"\"Dynamically generated python content\n directly incorporated into the HTML\"\"\"\u003C\u002Fspan\u003E\n \u003Cspan class=\"token comment\"\u003E# These are actual real-time weather.gov observations\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Etry\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E results \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token keyword\"\u003Eawait\u003C\u002Fspan\u003E all_weather\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eexcept\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E P\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'Weather not available'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n rows \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003ETr\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003ETd\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Ecity\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E*\u003C\u002Fspan\u003E\u003Cspan class=\"token builtin\"\u003Emap\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003ETd\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E d\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Evalues\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E cls\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"even:bg-purple\u
189002F5\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Efor\u003C\u002Fspan\u003E city\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003Ed \u003Cspan class=\"token keyword\"\u003Ein\u003C\u002Fspan\u003E results\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eitems\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E\n flds \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E'City'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E'Temp (C)'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E'Wind (kmh)'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E'Humidity'\u003C\u002Fspan\u003E\n head \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Thead\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token operator\"\u003E*\u003C\u002Fspan\u003E\u003Cspan class=\"token builtin\"\u003Emap\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003ETh\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E flds\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E cls\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"bg-purple\u002F10\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E Table\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Ehead\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E*\u003C\u002Fspan\u003Erows\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E cls\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"w-full\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Cimg srcset=\"\u002Fimages\u002Fposts\u002Fweather-table-fasthtml.avif, \u002Fimages\u002Fposts\u002Fweather-table-fasthtml.webp, \u002Fimages\u002Fposts\u002Fweather-table-fasthtml.png\" src=\"\u002Fimages\u002Fposts\u002Fweather-table-fasthtml.png\" alt=\"Weather Table\" loading=\"lazy\" decoding=\"async\" class=\"svelte-1ykl0dj\"\u003E\n\u003Ch3 id=\"how-does-fasthtml-compare-to-other-frameworks\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#how-does-fasthtml-compare-to-other-frameworks\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EHow Does FastHtml Compare to Other Frameworks?\u003C\u002Fh3\u003E\n\u003Cp\u003EFastHtml draws inspiration from FastAPI, particularly in terms of developer experience. If youâre already familiar with FastAPI, youâll find FastHtml extremely comfortable to work with. The main difference is in focus: FastAPI is designed for creating APIs, while FastHtml is tailored for creating HTML-based web applications. If youâre someone who prefers writing Python over JavaScript, FastHtml lets you build modern Single Page Applications (SPAs) without needing to rely heavily on JS frameworks.\u003C\u002Fp\u003E\n\u003Ch3 id=\"frontend-complexity-made-simple\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#frontend-complexity-made-simple\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EFrontend Complexity Made Simple\u003C\u002Fh3\u003E\n\u003Cp\u003EOne of the biggest headaches in modern web development is managing the frontend, especially with frameworks like React or Angular. These are powerful but can be overkill for simpler projects, introducing a lot of complexity. FastHtml, on the other hand, uses HTMXâa small JavaScript library that allows you to handle dynamic content directly within your HTML. This means you can create interactive elements like forms or content updates without writing much JavaScript, if any at all. Itâs a great way to manage frontend complexity while keeping your co
189debase lightweight and easy to maintain.\u003C\u002Fp\u003E\n\u003Ch3 id=\"what-can-you-build-with-fasthtml\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#what-can-you-build-with-fasthtml\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EWhat Can You Build with FastHtml?\u003C\u002Fh3\u003E\n\u003Cp\u003EFastHtml can be used for general purpose full stack web applications much like what you can build with React or Django, but much more lightweight and you donât have to contact switch between Python and JavaScript. Itâs particularly well-suited for creating quick dashboards, prototypes, and in-company appsâsimilar to what you might use frameworks like Gradio or Streamlit for. Itâs also great for interactive reports, custom blogs, and content-heavy sites where you want some interactive or dynamic features.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FAnswerDotAI\u002Ffasthtml-example\u002Ftree\u002Fmain\u002Fimage_app_simple\" rel=\"nofollow\"\u003EImage Generation UI\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cimg srcset=\"\u002Fimages\u002Fposts\u002Fimg-gen-ui-fasthtml.avif, \u002Fimages\u002Fposts\u002Fimg-gen-ui-fasthtml.webp, \u002Fimages\u002Fposts\u002Fimg-gen-ui-fasthtml.png\" src=\"\u002Fimages\u002Fposts\u002Fimg-gen-ui-fasthtml.png\" alt=\"Image Generation UI\" loading=\"lazy\" decoding=\"async\" class=\"svelte-1ykl0dj\"\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FAnswerDotAI\u002Ffasthtml-example\u002Ftree\u002Fmain\u002Fhacker_news_reskin\" rel=\"nofollow\"\u003EHacker News Feed\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cimg srcset=\"\u002Fimages\u002Fposts\u002Fhacker-news-feed.avif, \u002Fimages\u002Fposts\u002Fhacker-news-feed.webp, \u002Fimages\u002Fposts\u002Fhacker-news-feed.png\" src=\"\u002Fimages\u002Fposts\u002Fhacker-news-feed.png\" alt=\"Hacker News Feed\" loading=\"lazy\" decoding=\"async\" class=\"svelte-1ykl0dj\"\u003E\n\u003Ch3 id=\"modern-apps-with-fasthtml\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#modern-apps-with-fasthtml\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EModern Apps with FastHtml\u003C\u002Fh3\u003E\n\u003Cp\u003EWhatâs really cool about FastHtml is that itâs not just for traditional multi-page web apps; itâs also designed to make writing modern Single Page Applications (SPAs) as fast and easy as possible. By default, FastHtml routes return lightweight âpartialsâ that update the DOM directly, rather than reloading the entire page. This makes FastHtml apps potentially faster and more efficient than some JavaScript-heavy approaches.\u003C\u002Fp\u003E\n\u003Ch3 id=\"deployment-and-integration\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#deployment-and-integration\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EDeployment and Integration\u003C\u002Fh3\u003E\n\u003Cp\u003EYou can deploy FastHtml apps just like you would with any other web application, using standard web servers or cloud services. If youâre already using FastAPI, youâll find that FastHtml fits right into your existing workflow, allowing you to create comprehensive web applications without switching between different languages or frameworks.\u003C\u002Fp\u003E\n\u003Ch3 id=\"a-growing-but-young-project\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#a-growing-but-young-project\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EA Growing but Young Project\u003C\u002Fh3\u003E\n\u003Cp\u003ENow, itâs important to note that FastHtml is still a young project. While it offers a lot of promise, it doesnât yet have the extensive ecosystem or feature set that frameworks like Django or Flask boast. If you need something with a vast library of plugins or built-in support for complex functionalities, FastHtml might not fully meet your needsâat least not yet. However, the project is growing rapidly, with new features and improvements being added regularly. The community around FastHtml is also expanding, which bodes well for its future.\u003C\u002Fp\u003E\n\u003Ch3 id=\"conclusion\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#conclusion\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EConclusion\u003C\u002Fh3\u003E\n\u003Cp\u003EIn summary, FastHtml is a powerful yet simple framework that allows you to build modern, dynamic web applications using Python. It reduces the need for extensive JavaScript, offers great flexibility, and is rapidly growing both in features and community support. If youâre looking for a lightweight, efficient way to build web apps, FastHtml is definitely worth exploring. Here is a link to their website \u003Ca href=\"https:\u002F\u002Ffastht.ml\u002F\" rel=\"nofollow\"\u003EFastHtml\u003C\u002Fa\u003E and \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FAnswerDotAI\u002Ffasthtml\u002Ftree\u002Fmain\" rel=\"nofollow\"\u003EGithub\u003C\u002Fa\u003E.\u003C\u002Fp\u003E",readingTime:"4 min read",relatedPosts:[{title:"Behavioral Design Patterns in Software Development",slug:"behavioral-design-patterns",coverImage:"\u002Fimages\u002Fposts\u002Fbehavioral-design-patterns.jpg",date:"2024-04-24T00:00:00.000Z",excerpt:"An in-depth look at behavioral design patterns in software development, exploring Visitor, Template Method, Strategy, State, Observer, Memento, Mediator, Iterator, Interpreter, Command, and Chain of Responsibility patterns with examples and real-world applications.",tags:a,html:"\u003Ch2 id=\"introduction\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#introduction\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EIntroduction\u003C\u002Fh2\u003E\n\u003Cp\u003EBehavioral design patterns are crucial in software development as they help manage complex behaviors between objects, improve c
189ode 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\u003Cli\u003EPromotes code reuse\u003C\u002Fli\u003E\n\u003Cli\u003EEnsures the invariant parts of the algorithm are maintained\u003C\u002Fli\u003E\n\u003Cli\u003ESimplifies code maintenance\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"examples-1\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#examples-1\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EExamples\u003C\u002Fh3\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Efrom\u003C\u002Fspan\u003E abc \u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E ABC\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E abstractmethod\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EAbstractClass\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EABC\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Etemplate_method\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n self\u003Cspan class=\"token punctuation\"\u003E.\u0
18903C\u002Fspan\u003Ebase_operation1\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Erequired_operation1\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ebase_operation2\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Erequired_operation2\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token comment\"\u003E# Base operations with a default implementation\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Ebase_operation1\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"AbstractClass: Base operation 1\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Ebase_operation2\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"AbstractClass: Base operation 2\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token comment\"\u003E# Abstract methods to be implemented by subclasses\u003C\u002Fspan\u003E\n \u003Cspan class=\"token decorator annotation punctuation\"\u003E@abstractmethod\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Erequired_operation1\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Epass\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token decorator annotation punctuation\"\u003E@abstractmethod\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Erequired_operation2\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Epass\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token comment\"\u003E# Concrete implementations of AbstractClass\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteClassA\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EAbstractClass\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Erequired_operation1\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"ConcreteClassA: Implemented Operation1\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Erequired_operation2\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"ConcreteClassA: Implemented Operation2\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteClassB\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EAbstractClass\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Erequired_operation1\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"ConcreteClassB: Implemented Operation1\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Erequired_operation2\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"ConcreteClassB: Implemented Operation2\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token comment\"\u003E# Instantiate ConcreteClassA and execute the template method\u003C\u002Fspan\u003E\nclass_a \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ConcreteClassA\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nclass_a\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etemplate_method\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token comment\"\u003E# Instantiate ConcreteClassB and execute the template method\u003C\u002Fspan\u003E\nclass_b \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ConcreteClassB\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nclass_b\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etemplate_method\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Ch3 id=\"real-world-applications-1\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#real-world-applications-1\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EReal-world Applications\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Template Method pattern is commonly used in frameworks where the framework defines the skeleton of an algorithm, and the clients can extend or customize certain steps of the algorithm.\u003C\u002Fp\u003E\n\u003Ch2 id=\"strategy-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#strategy-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EStrategy Pattern\u003C\u002Fh2\u003E\n\u003Ch3 id=\"introduction-3\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#introduction-3\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EIntroduction\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Strategy pattern enables selecting an algorithmâs behavior at runtime. It defines a family of algorithms, encapsulates each one, and makes them interchangeable.\u003C\u002Fp\u003E\n\u003Ch3 id=\"definition-2\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#definition-2\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EDefinition\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Strategy pattern is a behavioral design pattern that allows defining a family of algorithms, encapsulating each one, and making them interchangeable without altering the client code.\u003C\u002Fp\u003E\n\u003Ch3 id=\"use-cases-2\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#use-cases-2\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EUse Cases\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EWhen you need to use different variants of an algorithm within an object\u003C\u002Fli\u003E\n\u003Cli\u003ETo isolate the algorithmâs code from the context it operates in\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"benefits-2\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#benefits-2\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EBenefits\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EPromotes the Open\u002FClosed Principle\u003C\u002Fli\u003E\n\u003Cli\u003EReduces conditional statements\u003C\u002Fli\u003E\n\u003Cli\u003EAllows the behavior of an object to be changed at runtime\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"examples-2\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#examples-2\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EExamples\u003C\u002Fh3\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EStrategy\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Edo_algorithm\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E data\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Epass\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteStrategyA\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EStrategy\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Edo_algorithm\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E data\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Esorted\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Edata\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteStrategyB\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EStrategy\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Edo_algorithm\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E data\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Esorted\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Edata\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E reverse\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token boolean\"\u003ETrue\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EContext\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E strategy\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_strategy \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E strategy\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eset_strategy\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E strategy\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_strategy \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E strategy\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eexecute_strategy\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E data\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_strategy\u003Cspan class=\"token punctuation
189\"\u003E.\u003C\u002Fspan\u003Edo_algorithm\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Edata\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\ndata \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token number\"\u003E1\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E3\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E2\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E5\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E4\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E\ncontext \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Context\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EConcreteStrategyA\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Econtext\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eexecute_strategy\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Edata\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\ncontext\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eset_strategy\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EConcreteStrategyB\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Econtext\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eexecute_strategy\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Edata\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Ch3 id=\"real-world-applications-2\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#real-world-applications-2\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EReal-world Applications\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Strategy pattern is often used in payment processing systems to select different payment methods, such as credit card, PayPal, or bank transfer, at runtime.\u003C\u002Fp\u003E\n\u003Ch2 id=\"state-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#state-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EState Pattern\u003C\u002Fh2\u003E\n\u003Ch3 id=\"introduction-4\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#introduction-4\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EIntroduction\u003C\u002Fh3\u003E\n\u003Cp\u003EThe State pattern allows an object to alter its behavior when its internal state changes. This pattern is particularly useful for objects that need to change their behavior based on their state.\u003C\u002Fp\u003E\n\u003Ch3 id=\"definition-3\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#definition-3\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EDefinition\u003C\u002Fh3\u003E\n\u003Cp\u003EThe State pattern is a behavioral design pattern that allows an object to change its behavior when its internal state changes, making the object appear to change its class.\u003C\u002Fp\u003E\n\u003Ch3 id=\"use-cases-3\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#use-cases-3\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EUse Cases\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EWhen an object must change its behavior at runtime depending on its state\u003C\u002Fli\u003E\n\u003Cli\u003ETo simplify state transition logic\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"benefits-3\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#benefits-3\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EBenefits\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003ELocalizes state-specific behavior\u003C\u002Fli\u003E\n\u003Cli\u003ESimplifies state transition logic\u003C\u002Fli\u003E\n\u003Cli\u003EPromotes the Open\u002FClosed Principle\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"examples-3\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#examples-3\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EExamples\u003C\u002Fh3\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EState\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Ehandle\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E context\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Epass\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteStateA\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EState\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Ehandle\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E context\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"State A handling request.\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n context\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Estate \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ConcreteStateB\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteStateB\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EState\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Ehandle\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E context\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"State B handling request.\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n context\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Estate \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ConcreteStateA\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EContext\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E state\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Estate \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E state\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Erequest\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Estate\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ehandle\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\ncontext \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Context\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EConcreteStateA\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\ncontext\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Erequest\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\ncontext\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Erequest\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Ch3 id=\"real-world-applications-3\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#real-world-applications-3\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EReal-world Applications\u003C\u002Fh3\u003E\n\u003Cp\u003EThe State pattern is used in UI frameworks to manage the state of UI elements, such as buttons that change behavior based on their state (e.g., enabled, disabled, pressed).\u003C\u002Fp\u003E\n\u003Ch2 id=\"observer-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#observer-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EObserver Pattern\u003C\u002Fh2\u003E\n\u003Ch3 id=\"introduction-5\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#introduction-5\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EIntroduction\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Observer pattern defines a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.\u003C\u002Fp\u003E\n\u003Ch3 id=\"definition-4\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#definition-4\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EDefinition\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Observer pattern is a behavioral design pattern that establishes a one-to-many dependency between objects, allowing one object to notify its dependents about state changes.\u003C\u002Fp\u003E\n\u003Ch3 id=\"use-cases-4\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#use-cases-4\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EUse Cases\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EWhen changes in one object need to be propagated to multiple dependent objects\u003C\u002Fli\u003E\n\u003Cli\u003ETo implement event handling systems\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"benefits-4\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#benefits-4\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EBenefits\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EPromotes loose coupling between objects\u003C\u002Fli\u003E\n\u003Cli\u003ESupports the principle of separating concerns\u003C\u002Fli\u003E\n\u003Cli\u003ESimplifies the maintenance of systems with multiple observers\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"examples-4\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#examples-4\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EExamples\u003C\u002Fh3\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003ESubject\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_observers \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eattach\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E observer\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_observers\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eappend\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eobserver\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Edetach\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E observer\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002F
189span\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\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_mementos \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eadd_memento\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E memento\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_mementos\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eappend\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Ememento\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eget_memento\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E index\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E self\u003Cspa
189n 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
189ommunication\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
189ollections 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
189ion\"\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
189003Cspan 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
189003Cspan 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
189ode 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:b,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
189pi_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
189003C\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
189pi_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
189003C\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
189pi_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
189pi_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
189003C\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
189003C\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:c,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
189ntly. 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
189s\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
189s\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
189s\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
189shield,â 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
189ython 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"}]},{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
189s 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
189on\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:a,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\u003Cli\u003EPromotes code reuse\u003C\u002Fli\u003E\n\u003Cli\u003EEnsures the i
189nvariant 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__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\
189u002Fspan\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 function\"\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\"token pun
189ctuation\"\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\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\
189u003E\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
189ommunication\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
189ollections 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
189ion\"\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
189003Cspan 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
189003Cspan 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
189ode 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:b,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
189pi_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
189003C\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
189pi_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
189003C\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
189pi_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
189pi_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
189003C\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
189003C\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:c,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
189ntly. 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
189s\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
189s\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
189s\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
189shield,â 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
189ython 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"}]},{title:"Exploring the Ollama Library Top Models and Their Applications",slug:"exploring-ollama-library",coverImage:"\u002Fimages\u002Fposts\u002Follama-exploration.jpg",date:"2024-04-28T00:00:00.000Z",excerpt:"Discover the top models in the Ollama Library, their strengths, weaknesses, and potential use cases. Learn how to choose the best model for your needs.",tags:["AI","Machine Learning","NLP","Models"],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\u003EIf youâve just installed Ollama on your computer and are excited to explore its range of models, youâre in the right place. In this article, weâll take a deep dive into the Ollama Library, discuss the different types of models available, and help you make an informed choice on which model suits your needs best.\u003C\u002Fp\u003E\n\u003Ch2 id=\"exploring-the-ollama-library\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#exploring-the-ollama-library\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EExploring the Ollama Library\u003C\u002Fh2\u003E\n\u003Ch3 id=\"sorting-models\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#sorting-models\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003ESorting Models\u003C\u002Fh3\u003E\n\u003Cp\u003EWhen you visit the Ollama Library at \u003Ca href=\"https:\u002F\u002Follama.ai\u002Flibrary?sort=featured\" rel=\"nofollow\"\u003Eollama.ai\u003C\u002Fa\u003E, youâll see a comprehensive list of available models. To make your search easier, you can sort this list using different parameters:\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EFeatured\u003C\u002Fstrong\u003E: Showcases the models recommended by the Ollama team as the best choices for most users.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EMost Popular\u003C\u002Fstrong\u003E: Ranks the models based on recent download numbers.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EMost Recent\u003C\u002Fstrong\u003E: Lets you explore the latest additions to the library.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"exploring-tags\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#exploring-tags\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EExploring Tags\u003C\u002Fh3\u003E\n\u003Cp\u003EEach model in the Ollama Library comes with various tags that give you specific information about its functionality. These tags appear after the colon in the modelâs name. Here are some key points about tags:\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003EThe âlatestâ tag usually indicates the most popular variation, not necessarily the newest version.\u003C\u002Fli\u003E\n\u003Cli\u003EIf you donât specify a tag, Ollama defaults to the model with the âlatestâ tag.\u003C\u002Fli\u003E\n\u003Cli\u003EUnder the latest tag, youâll find details like the modelâs size, the beginning of the SHA-256 digest, and the age of that particular model variation.\u003C\u002Fli\u003E\n\u003Cli\u003EThe right side of the tag displays the command required to run that specific version.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Cp\u003EUnderstanding these tags can help you make an informed decision when choosing a model.\u003C\u002Fp\u003E\n\u003Ch2 id=\"understanding-the-top-models\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#understanding-the-top-models\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EUnderstanding the Top Models\u003C\u002Fh2\u003E\n\u003Cp\u003ELetâs explore some of the top models available in the Ollama Library, highlighting their strengths, weaknesses, and potential use cases.\u003C\u002Fp\u003E\n\u003Ch3 id=\"gemma\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#gemma\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EGemma\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Cstrong\u003EStrengths:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003ELightweight and highly efficie
189nt, suitable for various NLP tasks.\u003C\u002Fli\u003E\n\u003Cli\u003EOutperforms similar-sized models in tasks such as coding and mathematical reasoning.\u003C\u002Fli\u003E\n\u003Cli\u003EAvailable in 2B and 7B parameter sizes, making it adaptable for different hardware configurations.\u003C\u002Fli\u003E\n\u003Cli\u003EOptimized for responsible AI development with extensive safety measures and human feedback integration.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cstrong\u003EWeaknesses:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003ESmaller models might not perform as well in highly complex or resource-intensive tasks compared to larger models.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cstrong\u003EUse Cases:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003EText generation, language understanding, and code completion.\u003C\u002Fli\u003E\n\u003Cli\u003ESuitable for mobile devices, desktops, and cloud deployment.\u003C\u002Fli\u003E\n\u003Cli\u003ECan be fine-tuned for specific tasks to enhance performance.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"mistral-openorca\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#mistral-openorca\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EMistral OpenOrca\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Cstrong\u003EStrengths:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003EFine-tuned on the OpenOrca dataset, excelling in language comprehension tasks.\u003C\u002Fli\u003E\n\u003Cli\u003EHigh performance in benchmarks, outperforming many other 7B and 13B models.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cstrong\u003EWeaknesses:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003EMay require significant computational resources for optimal performance.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cstrong\u003EUse Cases:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003EGeneral-purpose NLP, including question answering and text completion.\u003C\u002Fli\u003E\n\u003Cli\u003ESuitable for applications needing high accuracy in language understanding.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"llama-3\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#llama-3\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003ELlama 3\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Cstrong\u003EStrengths:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003EVersatile and powerful, suitable for a wide range of applications including dialogue systems and question answering.\u003C\u002Fli\u003E\n\u003Cli\u003EAvailable in multiple sizes, allowing for scalability based on resource availability.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cstrong\u003EWeaknesses:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003ELarger models require substantial computational power and memory.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cstrong\u003EUse Cases:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003EConversational agents, customer support systems, and interactive AI applications.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"stable-code\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#stable-code\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EStable Code\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Cstrong\u003EStrengths:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003EOptimized for code completion and generation, performing well compared to larger models like Code Llama 7B.\u003C\u002Fli\u003E\n\u003Cli\u003EFeatures Fill in Middle Capability (FIM) and supports long context sequences.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cstrong\u003EWeaknesses:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003EPrimarily focused on coding tasks, may not be as versatile for other types of language tasks.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cstrong\u003EUse Cases:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003EIDE integration for code completion, generation, and bug fixing.\u003C\u002Fli\u003E\n\u003Cli\u003EEnhancing developer productivity with advanced coding suggestions.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"wizardlm-2\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#wizardlm-2\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EWizardLM-2\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Cstrong\u003EStrengths:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003EHigh performance in complex tasks, reasoning, and multilingual capabilities.\u003C\u002Fli\u003E\n\u003Cli\u003EComparable to cutting-edge proprietary models, outperforming many open-source alternatives.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cstrong\u003EWeaknesses:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003ELarge model sizes may be resource-intensive.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cstrong\u003EUse Cases:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003EAdvanced question answering, reasoning tasks, and multilingual applications.\u003C\u002Fli\u003E\n\u003Cli\u003ESuitable for research and development in AI and machine learning.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"codegemma\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#codegemma\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003ECodeGemma\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Cstrong\u003EStrengths:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003ETailored for coding tasks, offering robust code generation and completion capabilities.\u003C\u002Fli\u003E\n\u003Cli\u003ELightweight models that are efficient and effective.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cstrong\u003EWeaknesses:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003EPrimarily focused on coding, might not excel in general language tasks.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cstrong\u003EUse Cases:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003EDeveloper tools for code generation and completion.\u003C\u002Fli\u003E\n\u003Cli\u003EEnhancing coding platforms with intelligent suggestions and error correction.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"llava\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#llava\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003ELlava\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Cstrong\u003EStrengths:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003ECombines vision and language understanding, suitable for multimodal tasks.\u003C\u002Fli\u003E\n\u003Cli\u003EHigh performance in visual recognition and text generation tasks.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cstrong\u003EWeaknesses:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003EMay require more computational resources due to its multimodal nature.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cstrong\u003EUse Cases:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003EApplications needing both visual and language understanding, such as interactive assistants and image captioning systems.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"phi\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#phi\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EPhi\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Cstrong\u003EStrengths:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003EStrong reasoning and language understanding capabilities.\u003C\u002Fli\u003E\n\u003Cli\u003EDeveloped by Microsoft Research, ensuring high quality and reliability.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cstrong\u003EWeaknesses:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003EMight be outperformed by larger or more specialized models in specific tasks.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cstrong\u003EUse Cases:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003EGeneral-purpose NLP tasks, including reasoning and comprehension.\u003C\u002Fli\u003E\n\u003Cli\u003ESuitable for applications requiring robust language understanding.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"orca-2\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#orca-2\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EOrca 2\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Cstrong\u003EStrengths:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003EFine-tuned for reasoning tasks, offering high accuracy and performance.\u003C\u002Fli\u003E\n\u003Cli\u003EBased on Metaâs Llama 2 models, ensuring a strong foundation.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cstrong\u003EWeaknesses:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003ELarge model sizes can be resource-intensive.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cstrong\u003EUse Cases:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003EApplications requiring logical reasoning and advanced question answering.\u003C\u002Fli\u003E\n\u003Cli\u003ESuitable for educational tools and interactive learning environments.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"command-r\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#command-r\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003ECommand R\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Cstrong\u003EStrengths:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003EOptimized for conversational interactions and long context tasks.\u003C\u002Fli\u003E\n\u003Cli\u003EDesigned for enterprise use cases, ensuring scalability and robustness.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cstrong\u003EWeaknesses:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003EMay be overkill for simpler applications that do not require extensive conversational capabilities.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cstrong\u003EUse Cases:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003ECustomer support systems, virtual assistants, and enterprise chatbots.\u003C\u002Fli\u003E\n\u003Cli\u003EApplications needing high accuracy in long and complex interactions.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch2 id=\"instruct-model-vs-text-model\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#instruct-model-vs-text-model\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EInstruct Model vs Text Model\u003C\u002Fh2\u003E\n\u003Cp\u003EIn the Ollama Library, youâll find two common types of models: instruct models and text models. Hereâs how they differ:\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EInstruct Model\u003C\u002Fstrong\u003E: Designed to work with chat interfaces, these models respond to user queries in an expected manner, ensuring a smooth conversational experience.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EText Model\u003C\u002Fstrong\u003E: These foundational models can be further trained by users with the necessary expertise, offering a solid base for customization and fine-tuning.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Cp\u003EChoose between an instruct model and a text model based on your specific needs and goals.\u003C\u002Fp\u003E\n\u003Ch2 id=\"the-importance-of-model-parameters\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#the-importance-of-model-parameters\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EThe Importance of Model Parameters\u003C\u002Fh2\u003E\n\u003Cp\u003EThe size and complexity of a model are determined by its parameters. While the number of parameters gives a rough idea of memory requirements, itâs not a direct correlation. For instance, an 8 billion parameter model might need around 8 GB of RAM, considering additional space for the operating system and context.\u003C\u002Fp\u003E\n\u003Cp\u003EUnderstanding these memory requirements is crucial for optimal model performance.\u003C\u002Fp\u003E\n\u003Ch2 id=\"the-significance-of-quantization\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#the-significance-of-quantization\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EThe Significance of Quantization\u003C\u002Fh2\u003E\n\u003Cp\u003EQuantization is key to compressing models and reducing their memory footprint. In the Ollama Library, you might see tags that start with âqâ followed by a number. Hereâs what you need to know:\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EQuantization\u003C\u002Fstrong\u003E: This technique compresses 32-bit floating-point numbers in the model to 4-bit integers, significantly reducing memory requirements without major performance loss.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003Eq4_0\u003C\u002Fstrong\u003E: This is often the recommended starting point, offering a good balance between memory savings and model performance.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Cp\u003ELeveraging quantization can greatly optimize your experience with Ollama models.\u003C\u002Fp\u003E\n\u003Ch2 id=\"choosing-the-right-model\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#choosing-the-right-model\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EChoosing the Right Model\u003C\u002Fh2\u003E\n\u003Cp\u003ESelecting the perfect model can be challenging due to overlapping functionalities and unique tasks. While benchmarks can provide insights, they might not cover all use cases. The best way to find the right model is through personal testing and observing their performance in your specific sce
189narios.\u003C\u002Fp\u003E\n\u003Ch2 id=\"the-layers-of-a-model\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#the-layers-of-a-model\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EThe Layers of a Model\u003C\u002Fh2\u003E\n\u003Cp\u003EIn Ollama, a model consists of multiple layers, each serving a distinct purpose. These layers include:\u003C\u002Fp\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EParameters\u003C\u002Fstrong\u003E: This layer includes stop parameters that instruct Ollama to disregard text beyond certain phrases.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ETemplate\u003C\u002Fstrong\u003E: Defines the format in which prompts should be provided for the model to understand. The template is based on the training process used by the model developers.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Cp\u003EUnderstanding these layers is important for effectively utilizing Ollamaâs capabilities and tailoring your prompts for the best responses.\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\u003EThe Ollama Library offers a diverse range of models, each with unique strengths and use cases. Whether youâre looking for lightweight models for mobile applications, powerful models for complex tasks, or specialized models for coding and multimodal tasks, the Ollama Library has something to offer. By understanding the different tags, parameters, and quantization techniques, you can make an informed decision on which model best suits your needs. Remember, the best way to find the right model is through personal testing and observation in your specific scenarios.\u003C\u002Fp\u003E",readingTime:"7 min read",relatedPosts:[{title:"Enhancing Response Accuracy with Instructor and Pydantic",slug:"why-instructor",coverImage:"\u002Fimages\u002Fposts\u002Fpython-workspace-cartoon.JPG",date:"2024-01-16T00:00:00.000Z",excerpt:"Exploring how Instru
189ctor leverages Pydantic to optimize OpenAI's function call API for more accurate and context-aware responses.",tags:["AI","Validation","Python","Machine Learning"],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\u003E\u003Ccode\u003EInstructor\u003C\u002Fcode\u003E is a powerful tool designed to enhance the accuracy of responses from OpenAIâs function call API. By integrating with \u003Ccode\u003EPydantic\u003C\u002Fcode\u003E, it simplifies the process of parsing, validating, and retrying API responses. This seamless integration allows developers to ensure more accurate and context-aware responses, making it an essential tool for anyone working with OpenAIâs API.\u003C\u002Fp\u003E\n\u003Ch2 id=\"the-need-for-dynamic-validation\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#the-need-for-dynamic-validation\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EThe Need for Dynamic Validation\u003C\u002Fh2\u003E\n\u003Cp\u003EIn the realm of software development, validation has traditionally been static and rule-based, limiting its adaptability to new challenges. Instructor, however, introduces a dynamic, machine learning-driven approach. This post dives into how Python libraries like \u003Ccode\u003EPydantic\u003C\u002Fcode\u003E and \u003Ccode\u003EInstructor\u003C\u002Fcode\u003E can be used to revolutionize validation in your software stack.\u003C\u002Fp\u003E\n\u003Ch3 id=\"the-problem-with-static-validation\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#the-problem-with-static-validation\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EThe Problem with Static Validation\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Cstrong\u003EScenario: Ensuring Data Integrity in Customer Information\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EIn a context where a software company is dedicated to maintaining accurate and reliable customer data, the challenge is to ensure all information conforms to standardized formats and criteria.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cstrong\u003EApproach\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EA practical method might involve establishing a list of validation rules for customer data entries. For instance, we could decide that email addresses must follow a specific format. We can adjust our validation framework in Pydantic to include these criteria.\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 pydantic \u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E BaseModel\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E EmailStr\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003ECustomer\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EBaseModel\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n name\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Estr\u003C\u002Fspan\u003E\n email\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E EmailStr\n phone_number\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Estr\u003C\u002Fspan\u003E\n address\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Estr\u003C\u002Fspan\u003E\n\ncustomer \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Customer\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\n name\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"John Doe\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n email\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"johndoe@notanemail\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n phone_number\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"1234567890\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n address\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"123 Main Street\"\u003C\u002Fspan\u003E\n\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Ecustomer\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token comment\"\u003E# value is not a valid email address: The part after the @-sign is not val
189id.\u003C\u002Fspan\u003E\n\u003Cspan class=\"token comment\"\u003E# It should have a period. \u003C\u002Fspan\u003E\n\u003Cspan class=\"token comment\"\u003E# [type=value_error, input_value='johndoe@notanemail', input_type=str]\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp\u003EThis results in error prevention for entries that do not meet the set standards, like incorrect email formats.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cstrong\u003EAdapting to New Challenges in Customer Information Validation\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EImagine we receive new customer data that, on the surface, seems valid but contains subtle inaccuracies or inappropriate content. For instance, a customer might enter a seemingly valid email address that actually includes objectionable language. Our basic validators for format and structure wouldnât flag this as an error, highlighting the need for more nuanced validation techniques.\u003C\u002Fp\u003E\n\u003Ch2 id=\"building-an-llm-powered-validator\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#building-an-llm-powered-validator\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EBuilding an LLM-Powered Validator\u003C\u002Fh2\u003E\n\u003Cp\u003EMoving beyond simple field validators, we now explore probabilistic validation in software 2.0, specifically through prompt engineering. We introduce an LLM-powered validator, \u003Ccode\u003Ellm_validator\u003C\u002Fcode\u003E, which uses contextual understanding to assess the validity of the data.\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 instructor \u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E llm_validator\n\u003Cspan class=\"token keyword\"\u003Efrom\u003C\u002Fspan\u003E pydantic \u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E BaseModel\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E ValidationError\n\u003Cspan class=\"token keyword\"\u003Efrom\u003C\u002Fspan\u003E typing \u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E Annotated\n\u003Cspan class=\"token keyword\"\u003Efrom\u003C\u002Fspan\u003E pydantic\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Efunctional_validators \u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E AfterValidator\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003ECustomerData\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EBaseModel\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n email\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E Annotated\u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token builtin\"\u003Estr\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E AfterValidator\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Ellm_validator\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"ensure valid and appropriate content\"\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\n\u003Cspan class=\"token keyword\"\u003Etry\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n CustomerData\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eemail\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"[email protected]\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Eexcept\u003C\u002Fspan\u003E ValidationError \u003Cspan class=\"token keyword\"\u003Eas\u003C\u002Fspan\u003E e\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Ee\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\u003E\u003Cbr\u003E\nThis validation process produces an error message for inappropriate or invalid content in customer data entries. For example:\n\u003Cbr\u003E\n\u003Cbr\u003E\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-bash\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-bash\"\u003E\u003Cspan class=\"token number\"\u003E1\u003C\u002Fspan\u003E validation error \u003Cspan class=\"token keyword\"\u003Efor\u003C\u002Fspan\u003E CustomerData\nemail\n Assertion failed, The email address contains inappropriate content. \n \u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003Etype\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003Eassertion_error, \u003Cspan class=\"token assign-left variable\"\u003Einput_value\u003C\u002Fspan\u003E\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'[email protected]'\u003C\u002Fspan\u003E, \u003Cspan class=\"token assign-left variable\"\u003Einput_type\u003C\u002Fspan\u003E\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003Estr\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\u003E\u003Cbr\u003E\nThe error message is generated by the language model (LLM), offering a context-sensitive approach to data validation. This method is particularly useful for dynamically adapting to new types of invalid or inappropriate content.\n\u003C\u002Fp\u003E\n\u003Ch2 id=\"advancing-to-machine-learning-driven-vali
189dation\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#advancing-to-machine-learning-driven-validation\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EAdvancing to Machine Learning-Driven Validation\u003C\u002Fh2\u003E\n\u003Cp\u003EThe integration of \u003Ccode\u003EInstructor\u003C\u002Fcode\u003E with \u003Ccode\u003EPydantic\u003C\u002Fcode\u003E allows for the utilization of machine learning models to enhance validation processes. It enables the transition from static, rule-based methods to dynamic, context-aware ones. This approach is particularly useful for adapting to new challenges in data validation.\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\u003E\u003Ccode\u003EInstructor\u003C\u002Fcode\u003E extends far beyond basic validation techniques, unlocking a myriad of advanced use cases in software development. It adeptly handles complex tasks such as Validating Citations From Original Text, Validating Chain of Thought, and provides robust Error Handling and Re-Asking mechanisms. These capabilities are not just incremental improvements; they represent a paradigm shift in how we approach data validation and processing.\u003C\u002Fp\u003E\n\u003Cp\u003EThe true power of \u003Ccode\u003EInstructor\u003C\u002Fcode\u003E is exemplified through its enhancements to the OpenAI class, primarily:\u003C\u002Fp\u003E\n\u003Col\u003E\u003Cli\u003E\u003Cp\u003EResponse Model: By specifying a \u003Ccode\u003EPydantic\u003C\u002Fcode\u003E model, \u003Ccode\u003EInstructor\u003C\u002Fcode\u003E streamlines data extraction, ensuring that responses are structured and precise.\u003C\u002Fp\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cp\u003EMax Retries: Customization of retry attempts is a game-changer, offering flexibility and resilience in handling request failures.\u003C\u002Fp\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cp\u003EValidation Context: The introduction of a context object for validators opens new doors for more nuanced and sophisticated validation strategies.\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003C\u002Fol\u003E\n\u003Cp\u003ETogether, \u003Ccode\u003EInstructor\u003C\u002Fcode\u003E and \u003Ccode\u003EPydantic\u003C\u002Fcode\u003E mark a significant leap in the evolution of dynamic validation. They are not just about preventing bad data; they empower large language models to understand, interpret, and correct data in a way that was previously unimaginable. This advancement paves the way for the development of more intelligent, adaptive, and responsive software systems.\u003C\u002Fp\u003E\n\u003Cp\u003EFor a deeper dive into the world of advanced validation and to experience the full potential of \u003Ccode\u003EInstructor\u003C\u002Fcode\u003E, I invite you to visit the \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fjxnl\u002Finstructor\" rel=\"nofollow\"\u003EGitHub page\u003C\u002Fa\u003E and explore the many ways it can enhance your projects.\u003C\u002Fp\u003E",readingTime:"4 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:b,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
189you 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
189pi_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
189003C\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
189pi_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
189003C\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
189pi_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
189pi_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
189003C\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
189003C\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"},{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:a,html:"\u003Ch2 id=\"introduction\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#introduction\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EIntroduction\u003C\u002Fh2\u003E\n\u003Cp\u003EBehavioral design patterns are crucial in software development as they help manage complex behaviors between objects, improve c
189ode 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\u003Cli\u003EPromotes code reuse\u003C\u002Fli\u003E\n\u003Cli\u003EEnsures the invariant parts of the algorithm are maintained\u003C\u002Fli\u003E\n\u003Cli\u003ESimplifies code maintenance\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"examples-1\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#examples-1\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EExamples\u003C\u002Fh3\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Efrom\u003C\u002Fspan\u003E abc \u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E ABC\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E abstractmethod\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EAbstractClass\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EABC\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Etemplate_method\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n self\u003Cspan class=\"token punctuation\"\u003E.\u0
18903C\u002Fspan\u003Ebase_operation1\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Erequired_operation1\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ebase_operation2\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Erequired_operation2\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token comment\"\u003E# Base operations with a default implementation\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Ebase_operation1\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"AbstractClass: Base operation 1\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Ebase_operation2\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"AbstractClass: Base operation 2\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token comment\"\u003E# Abstract methods to be implemented by subclasses\u003C\u002Fspan\u003E\n \u003Cspan class=\"token decorator annotation punctuation\"\u003E@abstractmethod\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Erequired_operation1\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Epass\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token decorator annotation punctuation\"\u003E@abstractmethod\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Erequired_operation2\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Epass\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token comment\"\u003E# Concrete implementations of AbstractClass\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteClassA\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EAbstractClass\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Erequired_operation1\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"ConcreteClassA: Implemented Operation1\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Erequired_operation2\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"ConcreteClassA: Implemented Operation2\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteClassB\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EAbstractClass\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Erequired_operation1\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"ConcreteClassB: Implemented Operation1\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Erequired_operation2\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"ConcreteClassB: Implemented Operation2\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token comment\"\u003E# Instantiate ConcreteClassA and execute the template method\u003C\u002Fspan\u003E\nclass_a \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ConcreteClassA\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nclass_a\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etemplate_method\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token comment\"\u003E# Instantiate ConcreteClassB and execute the template method\u003C\u002Fspan\u003E\nclass_b \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ConcreteClassB\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nclass_b\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etemplate_method\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Ch3 id=\"real-world-applications-1\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#real-world-applications-1\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EReal-world Applications\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Template Method pattern is commonly used in frameworks where the framework defines the skeleton of an algorithm, and the clients can extend or customize certain steps of the algorithm.\u003C\u002Fp\u003E\n\u003Ch2 id=\"strategy-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#strategy-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EStrategy Pattern\u003C\u002Fh2\u003E\n\u003Ch3 id=\"introduction-3\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#introduction-3\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EIntroduction\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Strategy pattern enables selecting an algorithmâs behavior at runtime. It defines a family of algorithms, encapsulates each one, and makes them interchangeable.\u003C\u002Fp\u003E\n\u003Ch3 id=\"definition-2\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#definition-2\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EDefinition\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Strategy pattern is a behavioral design pattern that allows defining a family of algorithms, encapsulating each one, and making them interchangeable without altering the client code.\u003C\u002Fp\u003E\n\u003Ch3 id=\"use-cases-2\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#use-cases-2\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EUse Cases\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EWhen you need to use different variants of an algorithm within an object\u003C\u002Fli\u003E\n\u003Cli\u003ETo isolate the algorithmâs code from the context it operates in\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"benefits-2\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#benefits-2\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EBenefits\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EPromotes the Open\u002FClosed Principle\u003C\u002Fli\u003E\n\u003Cli\u003EReduces conditional statements\u003C\u002Fli\u003E\n\u003Cli\u003EAllows the behavior of an object to be changed at runtime\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"examples-2\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#examples-2\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EExamples\u003C\u002Fh3\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EStrategy\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Edo_algorithm\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E data\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Epass\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteStrategyA\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EStrategy\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Edo_algorithm\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E data\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Esorted\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Edata\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteStrategyB\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EStrategy\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Edo_algorithm\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E data\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Esorted\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Edata\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E reverse\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token boolean\"\u003ETrue\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EContext\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E strategy\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_strategy \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E strategy\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eset_strategy\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E strategy\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_strategy \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E strategy\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eexecute_strategy\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E data\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_strategy\u003Cspan class=\"token punctuation
189\"\u003E.\u003C\u002Fspan\u003Edo_algorithm\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Edata\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\ndata \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token number\"\u003E1\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E3\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E2\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E5\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E4\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E\ncontext \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Context\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EConcreteStrategyA\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Econtext\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eexecute_strategy\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Edata\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\ncontext\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eset_strategy\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EConcreteStrategyB\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Econtext\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eexecute_strategy\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Edata\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Ch3 id=\"real-world-applications-2\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#real-world-applications-2\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EReal-world Applications\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Strategy pattern is often used in payment processing systems to select different payment methods, such as credit card, PayPal, or bank transfer, at runtime.\u003C\u002Fp\u003E\n\u003Ch2 id=\"state-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#state-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EState Pattern\u003C\u002Fh2\u003E\n\u003Ch3 id=\"introduction-4\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#introduction-4\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EIntroduction\u003C\u002Fh3\u003E\n\u003Cp\u003EThe State pattern allows an object to alter its behavior when its internal state changes. This pattern is particularly useful for objects that need to change their behavior based on their state.\u003C\u002Fp\u003E\n\u003Ch3 id=\"definition-3\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#definition-3\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EDefinition\u003C\u002Fh3\u003E\n\u003Cp\u003EThe State pattern is a behavioral design pattern that allows an object to change its behavior when its internal state changes, making the object appear to change its class.\u003C\u002Fp\u003E\n\u003Ch3 id=\"use-cases-3\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#use-cases-3\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EUse Cases\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EWhen an object must change its behavior at runtime depending on its state\u003C\u002Fli\u003E\n\u003Cli\u003ETo simplify state transition logic\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"benefits-3\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#benefits-3\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EBenefits\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003ELocalizes state-specific behavior\u003C\u002Fli\u003E\n\u003Cli\u003ESimplifies state transition logic\u003C\u002Fli\u003E\n\u003Cli\u003EPromotes the Open\u002FClosed Principle\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"examples-3\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#examples-3\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EExamples\u003C\u002Fh3\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EState\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Ehandle\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E context\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Epass\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteStateA\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EState\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Ehandle\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E context\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"State A handling request.\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n context\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Estate \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ConcreteStateB\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteStateB\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EState\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Ehandle\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E context\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"State B handling request.\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n context\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Estate \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ConcreteStateA\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EContext\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E state\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Estate \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E state\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Erequest\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Estate\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ehandle\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\ncontext \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Context\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EConcreteStateA\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\ncontext\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Erequest\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\ncontext\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Erequest\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Ch3 id=\"real-world-applications-3\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#real-world-applications-3\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EReal-world Applications\u003C\u002Fh3\u003E\n\u003Cp\u003EThe State pattern is used in UI frameworks to manage the state of UI elements, such as buttons that change behavior based on their state (e.g., enabled, disabled, pressed).\u003C\u002Fp\u003E\n\u003Ch2 id=\"observer-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#observer-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EObserver Pattern\u003C\u002Fh2\u003E\n\u003Ch3 id=\"introduction-5\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#introduction-5\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EIntroduction\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Observer pattern defines a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.\u003C\u002Fp\u003E\n\u003Ch3 id=\"definition-4\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#definition-4\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EDefinition\u003C\u002Fh3\u003E\n\u003Cp\u003EThe Observer pattern is a behavioral design pattern that establishes a one-to-many dependency between objects, allowing one object to notify its dependents about state changes.\u003C\u002Fp\u003E\n\u003Ch3 id=\"use-cases-4\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#use-cases-4\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EUse Cases\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EWhen changes in one object need to be propagated to multiple dependent objects\u003C\u002Fli\u003E\n\u003Cli\u003ETo implement event handling systems\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"benefits-4\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#benefits-4\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EBenefits\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EPromotes loose coupling between objects\u003C\u002Fli\u003E\n\u003Cli\u003ESupports the principle of separating concerns\u003C\u002Fli\u003E\n\u003Cli\u003ESimplifies the maintenance of systems with multiple observers\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"examples-4\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#examples-4\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EExamples\u003C\u002Fh3\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003C!-- HTML_TAG_START --\u003E\u003Ccode class=\"language-python\"\u003E\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003ESubject\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_observers \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eattach\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E observer\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_observers\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eappend\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eobserver\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Edetach\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E observer\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002F
189span\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\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_mementos \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eadd_memento\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E memento\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_mementos\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eappend\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Ememento\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eget_memento\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E index\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E self\u003Cspa
189n 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
189ommunication\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
189ollections 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
189ion\"\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
189003Cspan 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
189003Cspan 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
189ode 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:"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:a,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\u003Cli\u003EPromotes code reuse\u003C\u002Fli\u003E\n\u003Cli\u003EEnsures the invariant parts of the algorithm are maintained\u003C\u002Fli\u003E\n\u003Cli\u003ESimplifies code maintenance\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"examples-1\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#examples-1\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EExamples\u003C\u002Fh3\u003E\n\u003Cdiv class=\"code-block svelte-1pkpsrg\"\u003E\n\t\u003Cdiv class=\"lang svelte-1pkpsrg\"\u003Epython\u003C\u002Fdiv\u003E\n\t\u003Cpre class=\"language-python\"\u003E\u003
189C!-- 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__\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\u00
1893Cspan 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 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 \u00
1893Cspan 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\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_mementos \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eadd_memento\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation
189\"\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
189ommunication\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
189ollections 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
189ion\"\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
189003Cspan 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
189003Cspan 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
189ode 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",relatedPosts:[{title:"Creational Design Patterns in Software Development",slug:"creational-design-patterns",coverImage:"\u002Fimages\u002Fposts\u002Fcreational-design-patterns.jpg",date:"2024-04-16T00:00:00.000Z",excerpt:"An in-depth look at creational design patterns in software development, exploring Singleton, Prototype, Factory Method, Builder, and Abstract Factory 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\u003ECreational design patterns provide various ways to instantiate objects while abstracting the instantiation process. They lead to more flexible and reusable code, making it easier to design robust and maintainable software systems. This post will cover the Singleton, Prototype, Factory Method, Builder, and Abstract Factory patterns.\u003C\u002Fp\u003E\n\u003Ch2 id=\"singleton-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#singleton-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003ESingleton 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 Singleton pattern ensures that a class has only one instance and provides a global point of access to it. This pattern is often used in scenarios where exactly one object is needed to coordinate actions across the system.\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 Singleton pattern restricts the instantiation of a class to one single instance and provides a global access point to that instance.\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\u003ELogging\u003C\u002Fli\u003E\n\u003Cli\u003EConfiguration settings\u003C\u002Fli\u003E\n\u003Cli\u003EManaging connections to a database\u003C\u002Fli\u003E\n\u003Cli\u003ECaching\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\u003EControlled access to the sole instance\u003C\u002Fli\u003E\n\u003Cli\u003EReduced namespace pollution\u003C\u002Fli\u003E\n\u003Cli\u003EPermits refinement of operations and representation\u003C\u002Fli\u003E\n\u003Cli\u003EProvides a single point of access\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\"\u003ESingleton\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n _instance \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\"\u003E__new__\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Ecls\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 cls\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_instance \u003Cspan class=\"token keyword\"\u003Eis\u003C\u002Fspan\u003E \u003Cspan class=\"token boolean\"\u003ENone\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n cls\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_instance \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Esuper\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003ESingleton\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E cls\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E__new__\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Ecls\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E cls\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_instance\n\nsingleton1 \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Singleton\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nsingleton2 \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Singleton\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\u003Esingleton1 \u003Cspan class=\"token keyword\"\u003Eis\u003C\u002Fspan\u003E singleton2\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\"token comment\"\u003E# Output: True\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\u003EIn web applications, the Singleton pattern is often used for database connection pooling. For example, a web server may need a single database connection pool to manage access to the database, ensuring efficient resource utilization and connection management.\u003C\u002Fp\u003E\n\u003Ch2 id=\"prototype-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#prototype-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EPrototype 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 Prototype pattern is used to create a duplicate object while keeping performance in mind. This pattern involves implementing a prototype interface which tells to create a clone of the current object.\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 Prototype pattern is a creational design pattern in which new objects are created by copying an existing object, known as the prototype.\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 the type of objects to create is determined by a prototypical instance\u003C\u002Fli\u003E\n\u003Cli\u003ETo avoid the overhead of creating new objects from scratch\u003C\u002Fli\u003E\n\u003Cli\u003EWhen creating an object is costly or complex\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"benefits-1\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#benefits-1\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EBenefits\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EReduces the need for creating subclasses\u003C\u002Fli\u003E\n\u003Cli\u003ESpeeds up the instantiation process\u003C\u002Fli\u003E\n\u003Cli\u003ESimplifies the creation of complex objects\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\"\u003Eimport\u003C\u002Fspan\u003E copy\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EPrototype\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 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\u003Evalue \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E value\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eclone\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 copy\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Edeepcopy\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\nprototype1 \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Prototype\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 punctuation\"\u003E)\u003C\u002Fspan\u003E\nprototype2 \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E prototype1\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eclone\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nprototype2\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Evalue\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eappend\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token number\"\u003E4\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\u003Eprototype1\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Evalue\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\"token comment\"\u003E# Output: [1, 2, 3]\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eprototype2\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Evalue\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\"token comment\"\u003E# Output: [1, 2, 3, 4]\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\u003EIn game development, the Prototype pattern is used to create different game characters or objects dynamically. For instance, a game might have a prototypical enemy object that can be cloned and customized for different enemy types.\u003C\u002Fp\u003E\n\u003Ch2 id=\"factory-method-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#factory-method-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EFactory Method 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 Factory Method pattern defines an interface for creating an object but allows subclasses to alter the type of objects that will be created. This pattern lets a class defer instantiation to subclasses.\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 Factory Method pattern is a creational design pattern that provides an interface for creating objects in a superclass but allows subclasses to alter the type of objects that will be created.\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 a class cannot anticipate the type of objects it needs to create\u003C\u002Fli\u003E\n\u003Cli\u003ETo allow subclasses to provide specific implementations\u003C\u002Fli\u003E\n\u003Cli\u003ETo delegate the responsibility of instantiation to subclasses\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 loose coupling\u003C\u002Fli\u003E\n\u003Cli\u003EEnhances code reusability\u003C\u002Fli\u003E\n\u003Cli\u003EFacilitates the addition of new products without modifying existing code\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\u002F
189span\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\"\u003EProduct\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\"\u003Eoperation\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E-\u003C\u002Fspan\u003E\u003Cspan class=\"token operator\"\u003E\u003E\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Estr\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\"\u003EConcreteProductA\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EProduct\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\"\u003Eoperation\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E-\u003C\u002Fspan\u003E\u003Cspan class=\"token operator\"\u003E\u003E\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Estr\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\"Result of ConcreteProductA\"\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteProductB\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EProduct\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\"\u003Eoperation\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E-\u003C\u002Fspan\u003E\u003Cspan class=\"token operator\"\u003E\u003E\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Estr\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\"Result of ConcreteProductB\"\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003ECreator\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\"\u003Efactory_method\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E-\u003C\u002Fspan\u003E\u003Cspan class=\"token operator\"\u003E\u003E\u003C\u002Fspan\u003E Product\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Epass\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Esome_operation\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E-\u003C\u002Fspan\u003E\u003Cspan class=\"token operator\"\u003E\u003E\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Estr\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n product \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Efactory_method\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-interpolation\"\u003E\u003Cspan class=\"token string\"\u003Ef\"Creator: The same creator's code has just worked with \u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E{
189\u003C\u002Fspan\u003Eproduct\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\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteCreatorA\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003ECreator\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\"\u003Efactory_method\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E-\u003C\u002Fspan\u003E\u003Cspan class=\"token operator\"\u003E\u003E\u003C\u002Fspan\u003E Product\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E ConcreteProductA\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\"\u003EConcreteCreatorB\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003ECreator\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\"\u003Efactory_method\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E-\u003C\u002Fspan\u003E\u003Cspan class=\"token operator\"\u003E\u003E\u003C\u002Fspan\u003E Product\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E ConcreteProductB\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\ncreator_a \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ConcreteCreatorA\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\u003Ecreator_a\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Esome_operation\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 comment\"\u003E# Output: Creator: The same creator's code has just worked with Result of ConcreteProductA\u003C\u002Fspan\u003E\n\ncreator_b \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ConcreteCreatorB\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\u003Ecreator_b\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Esome_operation\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 comment\"\u003E# Output: Creator: The same creator's code has just worked with Result of ConcreteProductB\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\u003EIn web development frameworks, the Factory Method pattern is often used to create objects like controllers, services, or handlers based on configuration or user input.\u003C\u002Fp\u003E\n\u003Ch2 id=\"builder-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#builder-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EBuilder 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 Builder pattern separates the construction of a complex object from its representation, allowing the same construction process to create different representations.\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 Builder pattern is a creational design pattern that lets you construct complex objects step by step. The pattern allows you to produce different types and representations of an object using the same construction code.\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 requires numerous steps to be created\u003C\u002Fli\u003E\n\u003Cli\u003ETo construct composite objects\u003C\u002Fli\u003E\n\u003Cli\u003ETo improve readability and maintainability of the code\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\u003EAllows for more control over the construction process\u003C\u002Fli\u003E\n\u003Cli\u003EEnhances code readability and maintainability\u003C\u002Fli\u003E\n\u003Cli\u003ESupports the creation of different representations of an object\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\"\u003EHouse\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\u003Erooms \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 self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Efloors \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token number\"\u003E0\u003C\u002Fspan\u003E\n self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ehas_garage \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token boolean\"\u003EFalse\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003E__str__\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-interpolation\"\u003E\u003Cspan class=\"token string\"\u003Ef\"House with \u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E{\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Efloors\u003Cspan class=\"token punctuation\"\u003E}\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E floors, \u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E{\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'a garage'\u003C\u002Fspan\u003E \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ehas_garage \u003Cspan class=\"token keyword\"\u003Eelse\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E'no garage'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E}\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E, and rooms: \u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E{\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E', '\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ejoin\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Erooms\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\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EHouseBuilder\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\u003Ehouse \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E House\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_room\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E room\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\u003Ehouse\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Erooms\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eappend\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eroom\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E self\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eset_floors\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E floors\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\u003Ehouse\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Efloors \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E floors\n \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E self\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eadd_garage\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\u003Ehouse\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ehas_garage \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token boolean\"\u003ETrue\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E self\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Ebuild\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\u003Ehouse\n\nbuilder \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E HouseBuilder\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nhouse \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E builder\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eset_floors\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 punctuation\"\u003E.\u003C\u002Fspan\u003Eadd_room\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"Kitchen\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eadd_room\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"Bedroom\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eadd_garage\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ebuild\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\u003Ehouse\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\"token comment\"\
189u003E# Output: House with 2 floors, a garage, and rooms: Kitchen, Bedroom\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 Builder pattern is used in many modern development frameworks to construct complex objects such as UI components, configuration objects, or even SQL queries.\u003C\u002Fp\u003E\n\u003Ch2 id=\"abstract-factory-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#abstract-factory-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EAbstract Factory 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 Abstract Factory pattern provides an interface for creating families of related or dependent objects without specifying their concrete classes.\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 Abstract Factory pattern is a creational design pattern that lets you produce families of related objects without specifying their concrete classes.\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 a system needs to be independent of how its objects are created\u003C\u002Fli\u003E\n\u003Cli\u003ETo manage and organize a group of related or dependent objects\u003C\u002Fli\u003E\n\u003Cli\u003EWhen families of related objects need to be used together\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 consistency among products\u003C\u002Fli\u003E\n\u003Cli\u003EIsolates concrete classes\u003C\u002Fli\u003E\n\u003Cli\u003EFacilitates the exchange of product families\u003C\u002Fli\u003E\n\u003Cli\u003ESupports the addition of new products\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\"\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\"\u003EAbstractFactory\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\"\u003Ecreate_product_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\"\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\"\u003Ecreate_product_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\"\u003Epass\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteFactory1\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EAbstractFactory\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\"\u003Ecreate_product_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\"\u003Ereturn\u003C\u002Fspan\u003E ProductA1\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\"\u003Ecreate_product_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\"\u003Ereturn\u003C\u002Fspan\u003E ProductB1\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\"\u003EConcreteFactory2\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EAbstractFactory\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\"\u003Ecreate_product_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\"\u003Ereturn\u003C\u002Fspan\u003E ProductA2\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\"\u003Ecreate_product_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\"\u003Ereturn\u003C\u002Fspan\u003E ProductB2\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\"\u003EProductA1\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Euseful_function_a\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E-\u003C\u002Fspan\u003E\u003Cspan class=\"token operator\"\u003E\u003E\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Estr\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\"The result of the product A1.\"\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EProductA2\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Euseful_function_a\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E-\u003C\u002Fspan\u003E\u003Cspan class=\"token operator\"\u003E\u003E\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Estr\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\"The result of the product A2.\"\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EProductB1\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Euseful_function_b\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E-\u003C\u002Fspan\u003E\u003Cspan class=\"token operator\"\u003E\u003E\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Estr\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\"The result of the product B1.\"\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EProductB2\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Euseful_function_b\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E-\u003C\u002Fspan\u003E\u003Cspan class=\"token operator\"\u003E\u003E\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Estr\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\"The result of the product B2.\"\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eclient_code\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Efactory\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E AbstractFactory\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E-\u003C\u002Fspan\u003E\u003Cspan class=\"token operator\"\u003E\u003E\u003C\u002Fspan\u003E \u003Cspan class=\"token boolean\"\u003ENone\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n product_a \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E factory\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ecreate\n\n_product_a\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n product_b \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E factory\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ecreate_product_b\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\u003Eproduct_b\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Euseful_function_b\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\u003Eproduct_a\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Euseful_function_a\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\nclient_code\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EConcreteFactory1\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 comment\"\u003E# Output:\u003C\u002Fspan\u003E\n\u003Cspan class=\"token comment\"\u003E# The result of the product B1.\u003C\u002Fspan\u003E\n\u003Cspan class=\"token comment\"\u003E# The result of the product A1.\u003C\u002Fspan\u003E\n\nclient_code\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EConcreteFactory2\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 comment\"\u003E# Output:\u003C\u002Fspan\u003E\n\u003Cspan class=\"token comment\"\u003E# The result of the product B2.\u003C\u002Fspan\u003E\n\u003Cspan class=\"token comment\"\u003E# The result of the product A2.\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\u003EAbstract Factory patterns are commonly used in GUI toolkits to create families of related objects such as buttons, checkboxes, and windows, ensuring consistency across different platforms.\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\u003ECreational design patterns provide various ways to instantiate objects while abstracting the instantiation process, leading to more flexible and reusable code. By understanding and applying these patterns, developers can design more robust and maintainable software systems.\u003C\u002Fp\u003E",readingTime:"6 min read"},{title:"Structural Design Patterns in Software Development",slug:"structural-design-patterns",coverImage:"\u002Fimages\u002Fposts\u002Fstructural-design-patterns.jpg",date:"2024-04-20T00:00:00.000Z",excerpt:"An in-depth look a
189t structural design patterns in software development, exploring Proxy, Flyweight, Facade, Decorator, Composite, Bridge, and Adapter 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\u003EStructural design patterns are essential tools in software development that help manage relationships between objects, making systems more flexible, scalable, and maintainable. This post will cover the Proxy, Flyweight, Facade, Decorator, Composite, Bridge, and Adapter patterns.\u003C\u002Fp\u003E\n\u003Ch2 id=\"proxy-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#proxy-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EProxy 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 Proxy pattern provides a surrogate or placeholder for another object to control access to it. This pattern is used to create a representative object that controls access to another object, often to defer the full cost of its creation and initialization until we actually need to use it.\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 Proxy pattern is a structural design pattern that provides an object that acts as a substitute for a real service object, controlling access to it.\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\u003ELazy initialization\u003C\u002Fli\u003E\n\u003Cli\u003EAccess control\u003C\u002Fli\u003E\n\u003Cli\u003ELogging requests\u003C\u002Fli\u003E\n\u003Cli\u003EReducing the cost of accessing heavyweight objects\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\u003EAdds a level of indirection to support distributed, controlled, or intelligent access\u003C\u002Fli\u003E\n\u003Cli\u003EEnhances security by controlling access\u003C\u002Fli\u003E\n\u003Cli\u003EReduces the cost of accessing objects\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\"\u003ERealSubject\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\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 \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"RealSubject: Handling request.\"\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EProxy\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 real_subject\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_real_subject \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E real_subject\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 \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"Proxy: Checking access prior to firing a real request.\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n result \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_real_subject\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Erequest\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\"Proxy: Logging the time of request.\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E result\n\nreal_subject \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E RealSubject\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nproxy \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Proxy\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Ereal_subject\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eproxy\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Erequest\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\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\u003EProxies are widely used in web development for caching web pages, as well as in virtual proxies for memory-intensive objects in graphical applications.\u003C\u002Fp\u003E\n\u003Ch2 id=\"flyweight-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#flyweight-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EFlyweight 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 Flyweight pattern is used to minimize memory usage by sharing as much data as possible with similar objects. It is particularly useful for large numbers of similar objects.\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 Flyweight pattern is a structural design pattern that allows programs to
189support vast quantities of objects by keeping their memory consumption low.\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 an application uses a large number of similar objects\u003C\u002Fli\u003E\n\u003Cli\u003ETo avoid redundancy when there are many objects with shared data\u003C\u002Fli\u003E\n\u003Cli\u003EIn graphical applications for rendering similar objects\u003C\u002Fli\u003E\u003C\u002Ful\u003E\n\u003Ch3 id=\"benefits-1\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#benefits-1\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EBenefits\u003C\u002Fh3\u003E\n\u003Cul\u003E\u003Cli\u003EReduces memory consumption\u003C\u002Fli\u003E\n\u003Cli\u003EImproves performance by reusing existing objects\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\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EFlyweight\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 intrinsic_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_intrinsic_state \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E intrinsic_state\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 extrinsic_state\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\"Flyweight: Displaying shared \u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E{\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_intrinsic_state\u003Cspan class=\"token punctuation\"\u003E}\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E and unique \u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E{\u003C\u002Fspan\u003Eextrinsic_state\u003Cspan class=\"token punctuation\"\u003E}\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E state.\"\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\"\u003EFlyweightFactory\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n _flyweights \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 decorator annotation punctuation\"\u003E@classmethod\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eget_flyweight\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Ecls\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E intrinsic_state\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 intrinsic_state \u003Cspan class=\"token keyword\"\u003Enot\u
189003C\u002Fspan\u003E \u003Cspan class=\"token keyword\"\u003Ein\u003C\u002Fspan\u003E cls\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_flyweights\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n cls\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_flyweights\u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003Eintrinsic_state\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Flyweight\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eintrinsic_state\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E cls\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_flyweights\u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003Eintrinsic_state\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E\n\nfactory \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E FlyweightFactory\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nflyweight1 \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E factory\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eget_flyweight\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"shared_state\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nflyweight1\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eoperation\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"unique_state_1\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\nflyweight2 \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E factory\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eget_flyweight\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"shared_state\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nflyweight2\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eoperation\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"unique_state_2\"\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\u003Eflyweight1 \u003Cspan class=\"token keyword\"\u003Eis\u003C\u002Fspan\u003E flyweight2\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\"token comment\"\u003E# Output: True\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\u003EFlyweights are commonly used in text editors to manage character formatting, where characters are shared across different parts of the document.\u003C\u002Fp\u003E\n\u003Ch2 id=\"facade-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#facade-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EFacade 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 Facade pattern provides a simplified interface to a complex subsystem. This pattern aims to reduce the complexity of interacting with a large system b
189y providing a single entry point.\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 Facade pattern is a structural design pattern that offers a simple interface to a complex subsystem, making the subsystem easier to use.\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\u003ETo provide a simple interface to a complex system\u003C\u002Fli\u003E\n\u003Cli\u003ETo decouple clients from complex subsystem components\u003C\u002Fli\u003E\n\u003Cli\u003ETo make a library easier to use and understand\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\u003ESimplifies the use of a complex system\u003C\u002Fli\u003E\n\u003Cli\u003EReduces dependencies on the internal details of the subsystem\u003C\u002Fli\u003E\n\u003Cli\u003EImproves code readability and maintenance\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\"\u003ESubsystem1\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eoperation1\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\"Subsystem1: Ready!\"\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003ESubsystem2\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eoperation2\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\"Subsystem2: Go!\"\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EFacade\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_subsystem1 \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Subsystem1\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_subsystem2 \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Subsystem2\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\"\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 results \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 results\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eappend\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_subsystem1\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eoperation1\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 results\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eappend\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_subsystem2\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eoperation2\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\"\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\" \"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ejoin\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eresults\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\nfacade \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Facade\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\u003Efacade\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\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\u003EFacades are commonly used in software libraries, where a single interface is provided to interact with complex subsystems like databases, file systems, or network services.\u003C\u002Fp\u003E\n\u003Ch2 id=\"decorator-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#decorator-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EDecorator 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 Decorator pattern allows behavior to be added to individual objects, dynamically, without affecting the behavior of other objects from the same class. This pattern is often used for extending functionalities in a flexible and reusable way.\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 Decorator pattern is a structural design pattern that allows you to dynamically add behaviors to an object by placing these objects inside special wrapper objects that contain the behaviors.\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\u003ETo add responsibilities to objects dynamically and transparently\u003C\u002Fli\u003E\n\u003Cli\u003ETo extend the functionality of objects without modifying their code\u003C\u002Fli\u003E\n\u003Cli\u003ETo compose behaviors at runtime\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\u003EPromotes code reusability\u003C\u002Fli\u003E\n\u003Cli\u003EProvides greater flexibility than static inheritance\u003C\u002Fli\u003E\n\u003Cli\u003EExtends functionalities without modifying existing code\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\"\u003EComponent\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\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\"\u003Epass\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteComponent\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EComponent\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\"\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\"ConcreteComponent\"\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EDecorator\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EComponent\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 component\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_component \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E component\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 self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_component\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eoperation\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\"\u003EConcreteDecoratorA\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EDecorator\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\"\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-interpolation\"\u003E\u003Cspan class=\"token string\"\u003Ef\"ConcreteDecoratorA(\u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E{\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_component\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\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteDecoratorB\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EDecorator\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\"\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-interpolation\"\u003E\u003Cspan class=\"token string\"\u003Ef\"ConcreteDecoratorB(\u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E{\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_component\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eoperation\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u
189003E)\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\n\ncomponent \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ConcreteComponent\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\ndecorator1 \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ConcreteDecoratorA\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Ecomponent\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\ndecorator2 \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ConcreteDecoratorB\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Edecorator1\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Edecorator2\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\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\u003EIn GUI frameworks, decorators are used to add functionalities like scrolling, borders, and tooltips to graphical components dynamically.\u003C\u002Fp\u003E\n\u003Ch2 id=\"composite-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#composite-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EComposite 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 Composite pattern allows you to compose objects into tree structures to represent part-whole hierarchies. This pattern enables clients to treat individual objects and compositions of objects uniformly.\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 Composite pattern is a structural design pattern that lets you compose objects into tree structures and work with these structures as if they were individual objects.\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\u003ETo represent part-whole hierarchies\u003C\u002Fli\u003E\n\u003Cli\u003ETo allow clients to treat individual objects and compositions uniformly\u003C\u002Fli\u003E\n\u003Cli\u003EWhen you need to traverse complex structures of objects\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\u003ESimplifies client code\u003C\u002Fli\u003E\n\u003Cli\u003EMakes it easier to add new kinds of components\u003C\u002Fli\u003E\n\u003Cli\u003EPromotes consistency across similar objects\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\"\u003EComponent\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\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\"\u003Epass\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003ELeaf\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EComponent\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\"\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\"Leaf\"\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EComposite\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EComponent\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 self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_children \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\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E component\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_children\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eappend\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Ecomponent\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Eremove\u
189003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E component\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_children\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eremove\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Ecomponent\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 results \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 \u003Cspan class=\"token keyword\"\u003Efor\u003C\u002Fspan\u003E child \u003Cspan class=\"token keyword\"\u003Ein\u003C\u002Fspan\u003E self\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_children\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n results\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eappend\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Echild\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\n \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\"token string-interpolation\"\u003E\u003Cspan class=\"token string\"\u003Ef\"Composite(\u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E{\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'+'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ejoin\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eresults\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\n\nleaf1 \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Leaf\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nleaf2 \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Leaf\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\ncomposite \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Composite\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\ncomposite\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eadd\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eleaf1\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\ncomposite\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eadd\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eleaf2\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Ecomposite\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\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\u003EFile systems are a common real-world application of the Composite pattern, where files and directories are represented as individual and composite objects respectively.\u003C\u002Fp\u003E\n\u003Ch2 id=\"bridge-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#bridge-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EBridge 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 Bridge pattern is used to separate the abstraction from its implementation so that the two can vary independently. This pattern decouples an abstraction from its implementation, allowing the two to be developed independently.\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 Bridge pattern is a structural design pattern that splits a large class or a set of closely related classes into two separate hierarchiesâabstraction and implementationâwhich can be developed independently.\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 want to avoid a permanent binding between an abstraction and its implementation\u003C\u002Fli\u003E\n\u003Cli\u003EWhen both the abstractions and their implementations should be extensible by subclassing\u003C\u002Fli\u003E\n\u003Cli\u003ETo share an implementation among multiple objects\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\u003EDecouples the abstraction from its implementation\u003C\u002Fli\u003E\n\u003Cli\u003EIncreases extensibility\u003C\u002Fli\u003E\n\u003Cli\u003EHides implementation details from clients\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\"\u003EImplementation\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E\n\n operation_implementation\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\"\u003EConcreteImplementationA\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EImplementation\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\"\u003Eoperation_implementation\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\"ConcreteImplementationA\"\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EConcreteImplementationB\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EImplementation\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\"\u003Eoperation_implementation\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\"ConcreteImplementationB\"\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EAbstraction\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 implementation\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_implementation \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E implementation\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-interpolation\"\u003E\u003Cspan class=\"token string\"\u003Ef\"Abstraction: Base operation with: \u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E{\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_implementation\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eoperation_implementation\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\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EExtendedAbstraction\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EAbstraction\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\"\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-interpolation\"\u003E\u003Cspan class=\"token string\"\u003Ef\"ExtendedAbstraction: Extended operation with: \u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E{\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_implementation\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eoperation_implementation\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\n\nimplementation_a \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ConcreteImplementationA\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nabstraction \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Abstraction\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eimplementation_a\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eabstraction\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\n\nimplementation_b \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ConcreteImplementationB\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nextended_abstraction \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E ExtendedAbstraction\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eimplementation_b\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eextended_abstraction\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\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 Bridge pattern is used in GUI toolkits to separate the abstraction of UI components from their platform-specific implementations.\u003C\u002Fp\u003E\n\u003Ch2 id=\"adapter-pattern\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#adapter-pattern\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EAdapter 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 Adapter pattern allows incompatible interfaces to work together
189. This pattern involves a single class which is responsible to join functionalities of independent or incompatible interfaces.\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 Adapter pattern is a structural design pattern that allows objects with incompatible interfaces to collaborate.\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 want to use an existing class, but its interface does not match the one you need\u003C\u002Fli\u003E\n\u003Cli\u003ETo create a reusable class that can interact with unrelated or unforeseen classes\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 reusability of existing functionality\u003C\u002Fli\u003E\n\u003Cli\u003EProvides a way to use existing classes with incompatible interfaces\u003C\u002Fli\u003E\n\u003Cli\u003EEnhances flexibility in using different interfaces\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\"\u003ETarget\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\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 \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"Target: The default target's behavior.\"\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EAdaptee\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Especific_request\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\".eetpadA eht fo roivaheb laicepS\"\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\"token class-name\"\u003EAdapter\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003ETarget\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 adaptee\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_adaptee \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E adaptee\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 \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\"token string-interpolation\"\u003E\u003Cspan class=\"token string\"\u003Ef\"Adapter
189: (TRANSLATED) \u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E{\u003C\u002Fspan\u003Eself\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003E_adaptee\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Especific_request\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 format-spec\"\u003E-1]\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\n\nadaptee \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Adaptee\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nadapter \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Adapter\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eadaptee\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eadapter\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Erequest\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\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\u003EAdapters are frequently used in legacy system integration where new systems need to communicate with older systems with incompatible interfaces.\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\u003EStructural design patterns are essential tools in software development that help manage relationships between objects, making systems more flexible, scalable, and maintainable. By understanding and applying these patterns, developers can create robust and adaptable software architectures.\u003C\u002Fp\u003E",readingTime:"7 min read"},{title:"Accessing and Using the Gmail and Blogger APIs with Python",slug:"gmail-blogger-api-guide",coverImage:"\u002Fimages\u002Fposts\u002FDynamic-Blog-Cover.jpg",date:"2024-03-31T00:00:00.000Z",excerpt:"Step-by-step guide to accessing and using the Gmail and Blogger APIs in Python, from setup to sending your first email and creating blog posts.",tags:["API","Gmail","Blogger","Python","Programming","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\u003EThe Gmail and Blogger APIs provide powerful, flexible, and easy-to-use ways to manage your email and blog content programmatically. This blog post will guide you through the process of accessing and using these APIs with Python, covering everything from initial setup to sending your first email and creating blog posts.\u003C\u002Fp\u003E\n\u003Ch2 id=\"setting-up-your-google-cloud-project\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#setting-up-your-google-cloud-project\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003ESetting Up Your Google Cloud Project\u003C\u002Fh2\u003E\n\u003Cp\u003ETo use the Gmail and Blogger APIs, you need to set up a project on Google Cloud and enable the necessary APIs.\u003C\u002Fp\u003E\n\u003Col\u003E\u003Cli\u003E\u003Cp\u003E\u003Cstrong\u003ECreate a Google Cloud Project:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EGo to the \u003Ca href=\"https:\u002F\u002Fconsole.cloud.google.com\u002F\" rel=\"nofollow\"\u003EGoogle Cloud Console\u003C\u002Fa\u003E, and create a new project.\u003C\u002Fp\u003E\n\u003Cimg srcset=\"\u002Fimages\u002Fposts\u002Fillustrating-Google-Cloud-Project.avif, \u002Fimages\u002Fposts\u002Fillustrating-Google-Cloud-Project.webp, \u002Fimages\u002Fposts\u002Fillustrating-Google-Cloud-Project.png\" src=\"\u002Fimages\u002Fposts\u002Fillustrating-Google-Cloud-Project.jpeg\" alt=\"Creating a Google Cloud Project\" loading=\"lazy\" decoding=\"async\" class=\"svelte-1ykl0dj\"\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cp\u003E\u003Cstrong\u003EEnable the Gmail and Blogger APIs:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cp\u003ENavigate to the \u003Ca href=\"https:\u002F\u002Fconsole.developers.google.com\u002Fapis\u002Flibrary\u002Fgmail.googleapis.com\" rel=\"nofollow\"\u003EGmail API page\u003C\u002Fa\u003E and \u003Ca href=\"https:\u002F\u002Fconsole.developers.google.com\u002Fapis\u002Flibrary\u002Fblogger.googleapis.com\" rel=\"nofollow\"\u003EBlogger API page\u003C\u002Fa\u003E, and enable them for your project.\u003C\u002Fp\u003E\n\u003Cimg srcset=\"\u002Fimages\u002Fposts\u002Fenable-gmail-api.avif, \u002Fimages\u002Fposts\u002Fenable-gmail-api.webp, \u002Fimages\u002Fposts\u002Fenable-gmail-api.png\" src=\"\u002Fimages\u002Fposts\u002Fenable-gmail-api.jpg\" alt=\"Enabling the Gmail and Blogger APIs\" loading=\"lazy\" decoding=\"async\" class=\"svelte-1ykl0dj\"\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cp\u003E\u003Cstrong\u003ESet Up OAuth 2.0 Credentials:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EGo to the âCredentialsâ page, and create OAuth 2.0 Client IDs. Configure the consent screen, and then create credentials for a
189web application.\u003C\u002Fp\u003E\n\u003Cimg srcset=\"\u002Fimages\u002Fposts\u002Fgmail-OAuth-Setup.avif, \u002Fimages\u002Fposts\u002Fgmail-OAuth-Setup.webp, \u002Fimages\u002Fposts\u002Fgmail-OAuth-Setup.png\" src=\"\u002Fimages\u002Fposts\u002Fgmail-OAuth-Setup.jpg\" alt=\"Setting up OAuth 2.0 credentials\" loading=\"lazy\" decoding=\"async\" class=\"svelte-1ykl0dj\"\u003E\n\u003Cp\u003EDownload the JSON file containing your client credentials.\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003C\u002Fol\u003E\n\u003Ch2 id=\"installing-required-libraries\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#installing-required-libraries\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EInstalling Required Libraries\u003C\u002Fh2\u003E\n\u003Cp\u003ETo interact with the Gmail and Blogger APIs using Python, you need to install the necessary libraries. Use the following command to install them:\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 \u003Cspan class=\"token parameter variable\"\u003E--upgrade\u003C\u002Fspan\u003E google-api-python-client google-auth-httplib2 google-auth-oauthlib\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Ch2 id=\"authenticating-and-authorizing-your-application\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#authenticating-and-authorizing-your-application\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EAuthenticating and Authorizing Your Application\u003C\u002Fh2\u003E\n\u003Cp\u003ENext, you need to authenticate and authorize your application to access Gmail and Blogger data.\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\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Epath\n\u003Cspan class=\"token keyword\"\u003Efrom\u003C\u002Fspan\u003E google\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eauth\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etransport\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Erequests \u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E Request\n\u003Cspan class=\"token keyword\"\u003Efrom\u003C\u002Fspan\u003E google\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eoauth2\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ecredentials \u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E Credentials\n\u003Cspan class=\"token keyword\"\u003Efrom\u003C\u002Fspan\u003E google_auth_oauthlib\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eflow \u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E InstalledAppFlow\n\u003Cspan class=\"token keyword\"\u003Efrom\u003C\u002Fspan\u003E googleapiclient\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ediscovery \u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E build\n\n\u003Cspan class=\"token comment\"\u003E# If modifying these SCOPES, delete the file token.json.\u003C\u002Fspan\u003E\nSCOPES \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fgmail.readonly'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E'https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fblogger'\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\"\u003Eauthenticate\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Escopes\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n creds \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token boolean\"\u003ENone\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E os\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Epath\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eexists\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'token.json'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n creds \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Credentials\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Efrom_authorized_user_file\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'token.json'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E scopes\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E \u003Cspan class=\"token keyword\"\u003Enot\u
189003C\u002Fspan\u003E creds \u003Cspan class=\"token keyword\"\u003Eor\u003C\u002Fspan\u003E \u003Cspan class=\"token keyword\"\u003Enot\u003C\u002Fspan\u003E creds\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Evalid\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E creds \u003Cspan class=\"token keyword\"\u003Eand\u003C\u002Fspan\u003E creds\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eexpired \u003Cspan class=\"token keyword\"\u003Eand\u003C\u002Fspan\u003E creds\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Erefresh_token\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n creds\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Erefresh\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003ERequest\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\"\u003Eelse\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n flow \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E InstalledAppFlow\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Efrom_client_secrets_file\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'credentials.json'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E scopes\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n creds \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E flow\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Erun_local_server\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eport\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token number\"\u003E0\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Ewith\u003C\u002Fspan\u003E \u003Cspan class=\"token builtin\"\u003Eopen\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'token.json'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E'w'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\"token keyword\"\u003Eas\u003C\u002Fspan\u003E token\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n token\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ewrite\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Ecreds\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eto_json\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\"\u003Ereturn\u003C\u002Fspan\u003E creds\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\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n creds \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E authenticate\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003ESCOPES\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n gmail_service \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E build\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'gmail'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E'v1'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E credentials\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003Ecreds\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n blogger_service \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E build\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'blogger'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E'v3'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E credentials\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003Ecreds\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n \n \u003Cspan class=\"token comment\"\u003E# Call the Gmail API\u003C\u002Fspan\u003E\n results \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E gmail_service\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eusers\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Elabels\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\"\u003Elist\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EuserId\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'me'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\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 labels \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E results\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eget\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'labels'\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\n\n \u003Cspan class=\"token keyword\"\u003Eif\u003C\u002Fspan\u003E \u003Cspan class=\"token keyword\"\u003Enot\u
189003C\u002Fspan\u003E labels\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'No labels found.'\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 keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'Labels:'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Efor\u003C\u002Fspan\u003E label \u003Cspan class=\"token keyword\"\u003Ein\u003C\u002Fspan\u003E labels\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Elabel\u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'name'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\n \u003Cspan class=\"token comment\"\u003E# Call the Blogger API\u003C\u002Fspan\u003E\n blogs \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E blogger_service\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eblogs\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003ElistByUser\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EuserId\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'self'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\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 \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'Blogs:'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Efor\u003C\u002Fspan\u003E blog \u003Cspan class=\"token keyword\"\u003Ein\u003C\u002Fspan\u003E blogs\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eget\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'items'\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 punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eblog\u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'name'\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\"\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 main\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=\"sending-an-email-with-the-gmail-api\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#sending-an-email-with-the-gmail-api\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003ESending an Email with the Gmail API\u003C\u002Fh2\u003E\n\u003Cp\u003EWith authentication set up, you can now send an email using the Gmail API.\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 base64\n\u003Cspan class=\"token keyword\"\u003Efrom\u003C\u002Fspan\u003E email\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Emime\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Etext \u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E MIMEText\n\u003Cspan class=\"token keyword\"\u003Efrom\u003C\u002Fspan\u003E googleapiclient\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eerrors \u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E HttpError\n\n\u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Ecreate_message\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Esender\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E to\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E subject\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E message_text\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n message \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E MIMEText\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Emessage_text\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n message\u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'to'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E to\n message\u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'from'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E sender\n message\u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'subject'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E]\u003C\u002Fspan\u003E \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E subject\n raw \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E base64\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eurlsafe_b64encode\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Emessage\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eas_bytes\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\u003Edecode\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 punctuation\"\u003E{\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'raw'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E raw\u003Cspan class=\"token punctuation\"\u003E}\u003C\u002Fspan\u003E\n\n\u003Cspan class=\"token keyword\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Esend_message\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eservice\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E user_id\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E message\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 message \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E service\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eusers\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Emessages\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Esend\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EuserId\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003Euser_id\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E body\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003Emessage\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\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 \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'Message Id: \u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E{\u003C\u002Fspan\u003Emessage\u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"id\"\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 \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E message\n \u003Cspan class=\"token keyword\"\u003Eexcept\u003C\u002Fspan\u003E HttpError \u003Cspan class=\"token keyword\"\u003Eas\u003C\u002Fspan\u003E error\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'An error occurred: \u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E{\u003C\u002Fspan\u003Eerror\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 \u003Cspan class=\"token keyword\"\u003Ereturn\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\"\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 creds \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E authenticate\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003ESCOPES\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n service \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E build\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'gmail'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E'v1'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E credentials\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003Ecreds\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n sender \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"[email protected]\"\u003C\u002Fspan\u003E\n to \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"[email protected]\"\u003C\u002Fspan\u003E\n subject \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"Test Email\"\u003C\u002Fspan\u003E\n message_text \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"Hello, this is a test email from the Gmail API!\"\u003C\u002Fspan\u003E\n\n message \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E create_message\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Esender\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E to\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E subject\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E message_text\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n send_message\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eservice\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E'me'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E message\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 main\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=\"creating-a-blog-post-with-the-blogger-api\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#creating-a-blog-post-with-the-blogger-api\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003ECreating a Blog Post with the Blogger API\u003C\u002Fh2\u003E\n\u003Cp\u003ENow, letâs create a new blog post using the Blogger API.\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\"\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\"token function\"\u003Ecreate_blog_post\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eservice\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E blog_id\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E title\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E content\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u0
18903E:\u003C\u002Fspan\u003E\n post \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token punctuation\"\u003E{\u003C\u002Fspan\u003E\n \u003Cspan class=\"token string\"\u003E\"kind\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"blogger#post\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n \u003Cspan class=\"token string\"\u003E\"blog\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\"token punctuation\"\u003E{\u003C\u002Fspan\u003E\n \u003Cspan class=\"token string\"\u003E\"id\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E blog_id\n \u003Cspan class=\"token punctuation\"\u003E}\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n \u003Cspan class=\"token string\"\u003E\"title\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E title\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 content\n \u003Cspan class=\"token punctuation\"\u003E}\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Ereturn\u003C\u002Fspan\u003E service\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eposts\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Einsert\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003EblogId\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003Eblog_id\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E body\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003Epost\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\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\"\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 creds \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E authenticate\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003ESCOPES\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n service \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E build\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'blogger'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E'v3'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E credentials\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003Ecreds\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n blog_id \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E'your-blog-id'\u003C\u002Fspan\u003E\n title \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"Test Blog Post\"\u003C\u002Fspan\u003E\n content \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E\"This is a test blog post created using the Blogger API.\"\u003C\u002Fspan\u003E\n\n post \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E create_blog_post\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eservice\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E blog_id\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E title\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E content\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'Post created: \u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E{\u003C\u002Fspan\u003Epost\u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"url\"\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\"\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 main\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=\"using-the-python-package\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#using-the-python-package\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EUsing the Python Package\u003C\u002Fh2\u003E\n\u003Cp\u003ETo make the process of interacting with the Gmail and Blogger APIs easier, Iâve created a Python package. This package provides simple interfaces for common tasks. Hereâs how you can use it.\u003C\u002Fp\u003E\n\u003Ch3 id=\"gmail-class-examples\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#gmail-class-examples\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EGmail Class Examples\u003C\u002Fh3\u003E\n\u003Col\u003E\u003Cli\u003E\u003Cstrong\u003ESending an Email\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\u003C\u002Fol\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 gmail \u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E Gmail\n\ngmail \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Gmail\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'credentials.json'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E'token.json'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\ngmail\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Esend_email\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\n sender\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"[email protected]\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n to\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"[email protected]\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n subject\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"Test Email from Package\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n message_text\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"This is a test email sent using the Gmail package.\"\u003C\u002Fspan\u003E\n\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Col start=\"2\"\u003E\u003Cli\u003E\u003Cstrong\u003EListing Labels\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\u003C\u002Fol\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\"\u003Elabels \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E gmail\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Elist_labels\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\"Labels:\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Efor\u003C\u002Fspan\u003E label \u003Cspan class=\"token keyword\"\u003Ein\u003C\u002Fspan\u003E labels\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Elabel\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Col start=\"3\"\u003E\u003Cli\u003E\u003Cstrong\u003EReading Emails\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\u003C\u002Fol\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\"\u003Eemails \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E gmail\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Eread_emails\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\"Emails:\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Efor\u003C\u002Fspan\u003E email \u003Cspan class=\"token keyword\"\u003Ein\u003C\u002Fspan\u003E emails\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\"From: \u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E{\u003C\u002Fspan\u003Eemail\u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'from'\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, Subject: \u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E{\u003C\u002Fspan\u003Eemail\u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'subject'\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\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Ch3 id=\"blogger-class-examples\"\u003E\u003Ca class=\"heading-link\" title=\"Permalink\" aria-hidden=\"true\" href=\"#blogger-class-examples\"\u003E\u003Cspan\u003E#\u003C\u002Fspan\u003E\u003C\u002Fa\u003EBlogger Class Examples\u003C\u002Fh3\u003E\n\u003Col\u003E\u003Cli\u003E\u003Cstrong\u003ECreating a Blog Post\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\u003C\u002Fol\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 blogger \u003Cspan class=\"token keyword\"\u003Eimport\u003C\u002Fspan\u003E Blogger\n\nblogger \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E Blogger\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'credentials.json'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\"token string\"\u003E'token.json'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\nblogger\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Ecreate_post\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003E\n blog_id\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'your-blog-id'\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n title\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"Test Post from Package\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E,\u003C\u002Fspan\u003E\n content\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E\"This is a test post created using the Blogger package.\"\u003C\u002Fspan\u003E\n\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Col start=\"2\"\u003E\u003Cli\u003E\u003Cstrong\u003EListing Blogs\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\u003C\u002Fol\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\"\u003Eblogs \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E blogger\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Elist_blogs\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\"Blogs:\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Efor\u003C\u002Fspan\u003E blog \u003Cspan class=\"token keyword\"\u003Ein\u003C\u002Fspan\u003E blogs\u003Cspan class=\"token punctuation\"\u003E:\u003C\u002Fspan\u003E\n \u003Cspan class=\"token keyword\"\u003Eprint\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eblog\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C!-- HTML
189_TAG_END --\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Col start=\"3\"\u003E\u003Cli\u003E\u003Cstrong\u003EReading Blog Posts\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\u003C\u002Fol\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\"\u003Eposts \u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E blogger\u003Cspan class=\"token punctuation\"\u003E.\u003C\u002Fspan\u003Elist_posts\u003Cspan class=\"token punctuation\"\u003E(\u003C\u002Fspan\u003Eblog_id\u003Cspan class=\"token operator\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'your-blog-id'\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\"Posts:\"\u003C\u002Fspan\u003E\u003Cspan class=\"token punctuation\"\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\"token keyword\"\u003Efor\u003C\u002Fspan\u003E post \u003Cspan class=\"token keyword\"\u003Ein\u003C\u002Fspan\u003E posts\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\"Title: \u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E{\u003C\u002Fspan\u003Epost\u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'title'\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, URL: \u003C\u002Fspan\u003E\u003Cspan class=\"token interpolation\"\u003E\u003Cspan class=\"token punctuation\"\u003E{\u003C\u002Fspan\u003Epost\u003Cspan class=\"token punctuation\"\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\"token string\"\u003E'url'\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\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\u003EUsing the Gmail and Blogger APIs in Python opens up a world of possibilities for automating email and blog tasks. From sending and reading emails to creating and managing blog posts, these APIs provide a comprehensive set of features. By following this guide and using the provided Python package, you should now be able to set up your Google Cloud project, authenticate your application, and perform basic operations using the Gmail and Blogger APIs.\u003C\u002Fp\u003E\n\u003Cp\u003EFor more detailed information, refer to the \u003Ca href=\"https:\u002F\u002Fdevelopers.google.com\u002Fgmail\u002Fapi\" rel=\"nofollow\"\u003EGmail API documentation\u003C\u002Fa\u003E and \u003Ca href=\"https:\u002F\u002Fdevelopers.google.com\u002Fblogger\u002Fdocs\u002F3.0\u002Fgetting_started\" rel=\"nofollow\"\u003EBlogger API documentation\u003C\u002Fa\u003E. Additionally, you can find the source code for this guide on \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FTedfulk\u002Fgoogle_suite\" rel=\"nofollow\"\u003EGitHub\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n\u003Cp\u003EHappy coding!\u003C\u002Fp\u003E",readingTime:"5 min read"}]}]}}(Array(5),Array(7),Array(3))),"uses":{"url":1}}]; 190 191 Promise.all([ 192 import("./_app/immutable/entry/start.623e9a3d.js"),
193 import("./_app/immutable/entry/app.9894d4fc.js") 194 ]).then(([kit, app]) => { 195 kit.start(app, __sveltekit_oy0h6f.element, { 196 node_ids: [0, 3, 20], 197 data, 198 form: null, 199 error: null 200 }); 201 }); 202 } 203 </script>
203 204 </div> 205 </body> 206</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.