0

mathspp.com · 23d · discuss

Learn how to use the new frozendict built-in to create and manipulate immutable dictionaries. Python 3.15 introduced a new built-in data type: the frozendict. A frozendict is an immutable dictionary that can be created with the built-in of the same name: version_info = frozendict( {"major": 3, "minor": 15, "patch": 0} ) The dictionary literal syntax using the curly braces {} creates a regular dictionary, so you must always use the built-in frozendict to create a new frozen dictionary. In this article you'll learn about the characteristics of this immutable dictionary like its hashability, along with how to use this in conjunction with dict in typing contexts. 15 days of Python 3.15 To celebrate the release of Python 3.15, over the next 15 business days I'll be writing about a new 3.15 feature every day. Explained clearly and with examples so you don't have to sift through the changelog. Subscribe to receive this free email series: (function() { window.GravRecaptchaInitializers = window.GravRecaptchaInitializers || {}; function addHiddenInput(form, name, value) { const existing = form.querySelector('input[type="hidden"][name="' + name + '"]'); if (existing) { existing.value = value; } else { const input = document.createElement('input'); input.setAttribute('type', 'hidden'); input.setAttribute('name', name); input.setAttribute('value', value); form.insertBefore(input, form.firstChild); } } function initRecaptchaV3(container) { const formId = container.dataset.formId; const siteKey = container.dataset.sitekey; const action = container.dataset.action; const form = document.getElementById(formId); if (!form) return; console.log(`Initializing reCAPTCHA v3 for form ${formId}`); const submitHandler = function(event) { event.preventDefault(); console.log(`reCAPTCHA v3 intercepting submit for form ${formId}`); grecaptcha.ready(function() { grecaptcha.execute(siteKey, { action: action }) .then(function(token) { console.log(`reCAPTCHA v3 token received for form ${formId}`); addHiddenInput(form, 'data[token]', token); addHiddenInput(form, 'data[action]', action); form.removeEventListener('submit', submitHandler); if (form.dataset.xhrEnabled === 'true' && window.GravFormXHR && typeof window.GravFormXHR.submit === 'function') { window.GravFormXHR.submit(form); } else { if (typeof form.requestSubmit === 'function') { form.requestSubmit(); } else { form.submit(); } } setTimeout(() => { const currentForm = document.getElementById(formId); if (currentForm && !currentForm.dataset.recaptchaListenerAttached) { currentForm.addEventListener('submit', submitHandler); currentForm.dataset.recaptchaListenerAttached = 'true'; } else if (currentForm) { delete currentForm.dataset.recaptchaListenerAttached; } }, 0); }); }); }; delete form.dataset.recaptchaListenerAttached; if (!form.dataset.recaptchaListenerAttached) { form.addEventListener('submit', submitHandler); form.dataset.recaptchaListenerAttached = 'true'; } } // Register the initializer function const initializerFunctionName = 'initRecaptcha_enroll'; window.GravRecaptchaInitializers[initializerFunctionName] = function() { const container = document.querySelector('[data-form-id="enroll"][data-captcha-provider="recaptcha"]'); if (!container) return; initRecaptchaV3(container); }; // Initial call if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', window.GravRecaptchaInitializers[initializerFunctionName]); } else { setTimeout(window.GravRecaptchaInitializers[initializerFunctionName], 0); } })(); Enroll for free 🐍🚀 If you want, you can also check the schedule of the upcoming emails. Creation and usage You create immutable dictionaries with the built-in frozendict and you can access key/value pairs with the regular dictionary syntax: version_info = frozendict({"major": 3, "minor": 15, "patch": 0}) print(version_info["major"]) # 3 You can also iterate through a frozendict's keys, values, or items: for name, number in version_info.items(): print(name, number) """ major 3 minor 15 patch 0 """ If you don't have to support Python 3.14 or earlier, you should use frozendict whenever you're creating or returning a dictionary that isn't supposed to be explicitly and clearly used as mutable. Immutability of a frozendict The main premise of frozendict is that it's immutable: version_info = frozendict({"major":...