<?xml version='1.0' encoding='utf-8'?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Batu Lab Notes</title><id>https://batulabnotes.netlify.app/</id><link href="https://batulabnotes.netlify.app/feed.xml" rel="self" /><updated>2026-09-08T17:55:03.584450+00:00</updated><entry><id>https://batulabnotes.blogspot.com/2026/09/write-deterministic-json-for-local-cli.html</id><title>Write Deterministic JSON for Local CLI Reports</title><link href="https://batulabnotes.netlify.app/articles/write-deterministic-json-for-local-cli/" /><updated>2026-09-08T05:04:43.189-07:00</updated><summary>Write Deterministic JSON for Local CLI Reports</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/iki-metin-dosyasn-python-ile.html</id><title>Compare Two Text Files in Python Without Modifying Them</title><link href="https://batulabnotes.netlify.app/articles/iki-metin-dosyasn-python-ile/" /><updated>2026-09-08T04:55:41.331-07:00</updated><summary>Compare Two Text Files in Python Without Modifying Them</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/csvyi-ice-aktarmadan-once-yaplacak-7.html</id><title>Seven CSV Quality Checks to Run Before Importing Data</title><link href="https://batulabnotes.netlify.app/articles/csvyi-ice-aktarmadan-once-yaplacak-7/" /><updated>2026-09-08T04:54:58.788-07:00</updated><summary>Seven CSV Quality Checks to Run Before Importing Data</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/detect-duplicate-csv-headers-before.html</id><title>Detect duplicate CSV headers before mapping fields</title><link href="https://batulabnotes.netlify.app/articles/detect-duplicate-csv-headers-before-mapping-fields/" /><updated>2026-09-08T17:55:03.586036+00:00</updated><summary>Practical Python guidance: detect duplicate csv headers before mapping fields.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/treat-whitespace-only-csv-values-as.html</id><title>Treat whitespace-only CSV values as missing without rewriting data</title><link href="https://batulabnotes.netlify.app/articles/treat-whitespace-only-csv-values-as-missing-without-rewriting-data/" /><updated>2026-09-08T17:55:03.586254+00:00</updated><summary>Practical Python guidance: treat whitespace-only csv values as missing without rewriting data.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/explain-ragged-csv-rows-with-record.html</id><title>Explain ragged CSV rows with record-level evidence</title><link href="https://batulabnotes.netlify.app/articles/explain-ragged-csv-rows-with-record-level-evidence/" /><updated>2026-09-08T17:55:03.586449+00:00</updated><summary>Practical Python guidance: explain ragged csv rows with record-level evidence.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/choose-composite-csv-key-when-one.html</id><title>Choose a composite CSV key when one identifier is not unique</title><link href="https://batulabnotes.netlify.app/articles/choose-a-composite-csv-key-when-one-identifier-is-not-unique/" /><updated>2026-09-08T17:55:03.586764+00:00</updated><summary>Practical Python guidance: choose a composite csv key when one identifier is not unique.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/handle-blank-components-in-csv.html</id><title>Handle blank components in a CSV duplicate key</title><link href="https://batulabnotes.netlify.app/articles/handle-blank-components-in-a-csv-duplicate-key/" /><updated>2026-09-08T17:55:03.586927+00:00</updated><summary>Practical Python guidance: handle blank components in a csv duplicate key.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/validate-utf-8-csv-with-byte-order-mark.html</id><title>Validate a UTF-8 CSV with a byte-order mark</title><link href="https://batulabnotes.netlify.app/articles/validate-a-utf-8-csv-with-a-byte-order-mark/" /><updated>2026-09-08T17:55:03.587078+00:00</updated><summary>Practical Python guidance: validate a utf-8 csv with a byte-order mark.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/design-encoding-failure-report-that.html</id><title>Design an encoding-failure report that a shell script can use</title><link href="https://batulabnotes.netlify.app/articles/design-an-encoding-failure-report-that-a-shell-script-can-use/" /><updated>2026-09-08T17:55:03.587227+00:00</updated><summary>Practical Python guidance: design an encoding-failure report that a shell script can use.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-newline-handling-correctly-with.html</id><title>Use newline handling correctly with Python csv readers</title><link href="https://batulabnotes.netlify.app/articles/use-newline-handling-correctly-with-python-csv-readers/" /><updated>2026-09-08T17:55:03.587668+00:00</updated><summary>Practical Python guidance: use newline handling correctly with python csv readers.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/constrain-delimiter-detection-instead.html</id><title>Constrain delimiter detection instead of trusting a heuristic</title><link href="https://batulabnotes.netlify.app/articles/constrain-delimiter-detection-instead-of-trusting-a-heuristic/" /><updated>2026-09-08T17:55:03.587985+00:00</updated><summary>Practical Python guidance: constrain delimiter detection instead of trusting a heuristic.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/detect-unexpected-csv-column-without.html</id><title>Detect an unexpected CSV column without rejecting useful exports</title><link href="https://batulabnotes.netlify.app/articles/detect-an-unexpected-csv-column-without-rejecting-useful-exports/" /><updated>2026-09-08T17:55:03.588284+00:00</updated><summary>Practical Python guidance: detect an unexpected csv column without rejecting useful exports.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/preserve-leading-zero-identifiers.html</id><title>Preserve leading-zero identifiers during CSV preflight</title><link href="https://batulabnotes.netlify.app/articles/preserve-leading-zero-identifiers-during-csv-preflight/" /><updated>2026-09-08T17:55:03.588556+00:00</updated><summary>Practical Python guidance: preserve leading-zero identifiers during csv preflight.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/distinguish-empty-strings-from-missing.html</id><title>Distinguish empty strings from missing CSV columns</title><link href="https://batulabnotes.netlify.app/articles/distinguish-empty-strings-from-missing-csv-columns/" /><updated>2026-09-08T17:55:03.588979+00:00</updated><summary>Practical Python guidance: distinguish empty strings from missing csv columns.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/check-whether-csv-header-normalization.html</id><title>Check whether CSV header normalization creates a collision</title><link href="https://batulabnotes.netlify.app/articles/check-whether-csv-header-normalization-creates-a-collision/" /><updated>2026-09-08T17:55:03.589214+00:00</updated><summary>Practical Python guidance: check whether csv header normalization creates a collision.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/report-duplicate-rows-without-exposing.html</id><title>Report duplicate rows without exposing the whole row</title><link href="https://batulabnotes.netlify.app/articles/report-duplicate-rows-without-exposing-the-whole-row/" /><updated>2026-09-08T17:55:03.589439+00:00</updated><summary>Practical Python guidance: report duplicate rows without exposing the whole row.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/keep-json-csv-reports-from-overwriting.html</id><title>Keep JSON CSV reports from overwriting an existing file</title><link href="https://batulabnotes.netlify.app/articles/keep-json-csv-reports-from-overwriting-an-existing-file/" /><updated>2026-09-08T17:55:03.589768+00:00</updated><summary>Practical Python guidance: keep json csv reports from overwriting an existing file.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/test-csv-report-output-against-symlink.html</id><title>Test CSV report output against symlink and hardlink aliases</title><link href="https://batulabnotes.netlify.app/articles/test-csv-report-output-against-symlink-and-hardlink-aliases/" /><updated>2026-09-08T17:55:03.590067+00:00</updated><summary>Practical Python guidance: test csv report output against symlink and hardlink aliases.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/return-clear-exit-statuses-from-csv.html</id><title>Return clear exit statuses from a CSV preflight check</title><link href="https://batulabnotes.netlify.app/articles/return-clear-exit-statuses-from-a-csv-preflight-check/" /><updated>2026-09-08T17:55:03.590281+00:00</updated><summary>Use CSV parsing to return stable clean, finding, and input-error statuses from a local preflight command.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/set-field-size-policy-for-unusually.html</id><title>Set a field-size policy for unusually large CSV cells</title><link href="https://batulabnotes.netlify.app/articles/set-a-field-size-policy-for-unusually-large-csv-cells/" /><updated>2026-09-08T17:55:03.590441+00:00</updated><summary>Practical Python guidance: set a field-size policy for unusually large csv cells.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/explain-strict-csv-parsing-as-choice.html</id><title>Explain strict CSV parsing as a choice, not a repair</title><link href="https://batulabnotes.netlify.app/articles/explain-strict-csv-parsing-as-a-choice-not-a-repair/" /><updated>2026-09-08T17:55:03.590580+00:00</updated><summary>Practical Python guidance: explain strict csv parsing as a choice, not a repair.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/count-csv-records-when-quoted-fields.html</id><title>Count CSV records when quoted fields span physical lines</title><link href="https://batulabnotes.netlify.app/articles/count-csv-records-when-quoted-fields-span-physical-lines/" /><updated>2026-09-08T17:55:03.590745+00:00</updated><summary>Practical Python guidance: count csv records when quoted fields span physical lines.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/create-csv-required-column-contract-for.html</id><title>Create a CSV required-column contract for a one-off import</title><link href="https://batulabnotes.netlify.app/articles/create-a-csv-required-column-contract-for-a-one-off-import/" /><updated>2026-09-08T17:55:03.590974+00:00</updated><summary>Practical Python guidance: create a csv required-column contract for a one-off import.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/validate-decimal-looking-csv-fields.html</id><title>Validate decimal-looking CSV fields without changing them</title><link href="https://batulabnotes.netlify.app/articles/validate-decimal-looking-csv-fields-without-changing-them/" /><updated>2026-09-08T17:55:03.591308+00:00</updated><summary>Practical Python guidance: validate decimal-looking csv fields without changing them.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/compare-two-csv-header-shapes-before.html</id><title>Compare two CSV header shapes before an import migration</title><link href="https://batulabnotes.netlify.app/articles/compare-two-csv-header-shapes-before-an-import-migration/" /><updated>2026-09-08T17:55:03.591511+00:00</updated><summary>Practical Python guidance: compare two csv header shapes before an import migration.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/keep-comment-like-rows-out-of-csv.html</id><title>Keep comment-like rows out of a CSV contract discussion</title><link href="https://batulabnotes.netlify.app/articles/keep-comment-like-rows-out-of-a-csv-contract-discussion/" /><updated>2026-09-08T17:55:03.591665+00:00</updated><summary>Practical Python guidance: keep comment-like rows out of a csv contract discussion.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/explain-why-csv-null-round-trips-can.html</id><title>Explain why CSV null round-trips can lose meaning</title><link href="https://batulabnotes.netlify.app/articles/explain-why-csv-null-round-trips-can-lose-meaning/" /><updated>2026-09-08T17:55:03.591805+00:00</updated><summary>Practical Python guidance: explain why csv null round-trips can lose meaning.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/choose-pathlib-lexical-paths-versus.html</id><title>Choose pathlib lexical paths versus resolved paths in a local tool</title><link href="https://batulabnotes.netlify.app/articles/choose-pathlib-lexical-paths-versus-resolved-paths-in-a-local-tool/" /><updated>2026-09-08T17:55:03.591944+00:00</updated><summary>Practical Python guidance: choose pathlib lexical paths versus resolved paths in a local tool.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/create-new-local-report-without.html</id><title>Create a new local report without replacing an existing file</title><link href="https://batulabnotes.netlify.app/articles/create-a-new-local-report-without-replacing-an-existing-file/" /><updated>2026-09-08T17:55:03.592075+00:00</updated><summary>Practical Python guidance: create a new local report without replacing an existing file.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/return-readable-cli-error-when-report.html</id><title>Return a readable CLI error when a report parent directory is missing</title><link href="https://batulabnotes.netlify.app/articles/return-a-readable-cli-error-when-a-report-parent-directory-is-missing/" /><updated>2026-09-08T17:55:03.592301+00:00</updated><summary>Practical Python guidance: return a readable cli error when a report parent directory is missing.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-bytes-assertions-to-prove-read-only.html</id><title>Use bytes assertions to prove a read-only input stayed unchanged</title><link href="https://batulabnotes.netlify.app/articles/use-bytes-assertions-to-prove-a-read-only-input-stayed-unchanged/" /><updated>2026-09-08T17:55:03.592434+00:00</updated><summary>Practical Python guidance: use bytes assertions to prove a read-only input stayed unchanged.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/decide-when-to-read-local-file-as-bytes.html</id><title>Decide when to read a local file as bytes instead of text</title><link href="https://batulabnotes.netlify.app/articles/decide-when-to-read-a-local-file-as-bytes-instead-of-text/" /><updated>2026-09-08T17:55:03.592567+00:00</updated><summary>Practical Python guidance: decide when to read a local file as bytes instead of text.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/explain-json-decode-errors-as-input.html</id><title>Explain JSON decode errors as input findings</title><link href="https://batulabnotes.netlify.app/articles/explain-json-decode-errors-as-input-findings/" /><updated>2026-09-08T17:55:03.592698+00:00</updated><summary>Practical Python guidance: explain json decode errors as input findings.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/make-argparse-exit-behavior-testable.html</id><title>Make argparse exit behavior testable</title><link href="https://batulabnotes.netlify.app/articles/make-argparse-exit-behavior-testable/" /><updated>2026-09-08T17:55:03.592832+00:00</updated><summary>Practical Python guidance: make argparse exit behavior testable.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/separate-stdout-data-from-stderr.html</id><title>Separate stdout data from stderr diagnostics in a CLI</title><link href="https://batulabnotes.netlify.app/articles/separate-stdout-data-from-stderr-diagnostics-in-a-cli/" /><updated>2026-09-08T17:55:03.592968+00:00</updated><summary>Practical Python guidance: separate stdout data from stderr diagnostics in a cli.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-temporary-directories-for.html</id><title>Use temporary directories for filesystem tests</title><link href="https://batulabnotes.netlify.app/articles/use-temporary-directories-for-filesystem-tests/" /><updated>2026-09-08T17:55:03.593112+00:00</updated><summary>A filesystem test needs a directory it owns. `TemporaryDirectory` creates that directory and removes it when the `with` block finishes, including when an assertion raises. Construc</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/limit-local-file-reads-before-parsing.html</id><title>Limit local file reads before parsing a manifest</title><link href="https://batulabnotes.netlify.app/articles/limit-local-file-reads-before-parsing-a-manifest/" /><updated>2026-09-08T17:55:03.593417+00:00</updated><summary>Checking `Path.stat().st_size` before parsing can reject an obviously oversized manifest without loading its contents. Here the fixture contains 33 bytes and the demonstration limi</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/walk-project-tree-without-following.html</id><title>Walk a project tree without following directory symlinks</title><link href="https://batulabnotes.netlify.app/articles/walk-a-project-tree-without-following-directory-symlinks/" /><updated>2026-09-08T17:55:03.593629+00:00</updated><summary>`os.walk(root, followlinks=False)` avoids descending through directory symlinks. The example also removes symlink entries from the mutable directory list before descent, making its</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/design-ignore-lists-for-local-project.html</id><title>Design ignore lists for local project scans</title><link href="https://batulabnotes.netlify.app/articles/design-ignore-lists-for-local-project-scans/" /><updated>2026-09-08T17:55:03.593796+00:00</updated><summary>To exclude generated directories with `os.walk`, edit the supplied directory list in place before the next iteration. The slice assignment changes the list that the walker will con</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/keep-absolute-machine-paths-out-of.html</id><title>Keep absolute machine paths out of shareable reports</title><link href="https://batulabnotes.netlify.app/articles/keep-absolute-machine-paths-out-of-shareable-reports/" /><updated>2026-09-08T17:55:03.593957+00:00</updated><summary>A shareable report rarely needs the absolute directory where a project happened to be checked out. `Path.relative_to(root)` expresses a discovered path using the selected project r</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/normalize-line-endings-in-generated.html</id><title>Normalize line endings in a generated text artifact</title><link href="https://batulabnotes.netlify.app/articles/normalize-line-endings-in-a-generated-text-artifact/" /><updated>2026-09-08T17:55:03.594113+00:00</updated><summary>For a generated artifact with an explicit LF convention, writing bytes avoids platform-dependent text newline translation. The byte literal in this example contains two lines, each</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/handle-unknown-text-encoding-name.html</id><title>Handle an unknown text encoding name without a Python traceback</title><link href="https://batulabnotes.netlify.app/articles/handle-an-unknown-text-encoding-name-without-a-python-traceback/" /><updated>2026-09-08T17:55:03.594253+00:00</updated><summary>Validate a requested text encoding before attempting to decode input. `codecs.lookup` resolves a registered encoding name and raises `LookupError` when that name is unknown. Catchi</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/treat-unicode-normalization-in.html</id><title>Treat Unicode normalization in filenames as a portability concern</title><link href="https://batulabnotes.netlify.app/articles/treat-unicode-normalization-in-filenames-as-a-portability-concern/" /><updated>2026-09-08T17:55:03.594396+00:00</updated><summary>Two filenames can look alike while their Unicode strings differ. The example compares a precomposed accented character with an equivalent sequence containing a combining accent. Th</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-toml-parser-only-for-supported.html</id><title>Use a TOML parser only for supported manifest fields</title><link href="https://batulabnotes.netlify.app/articles/use-a-toml-parser-only-for-supported-manifest-fields/" /><updated>2026-09-08T17:55:03.594706+00:00</updated><summary>tomllib.loads answers whether text is syntactically TOML and returns nested Python mappings. It does not decide whether a product supports project.name. The script reads </summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/build-safe-zip-allowlist-for.html</id><title>Build a safe ZIP allowlist for a downloadable product</title><link href="https://batulabnotes.netlify.app/articles/build-a-safe-zip-allowlist-for-a-downloadable-product/" /><updated>2026-09-08T17:55:03.594863+00:00</updated><summary>writestr creates the named archive member directly. Reopening the finished ZIP and comparing namelist checks the central-directory result, not just the code’s intended wr</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/inspect-zip-before-delivery-without.html</id><title>Inspect a ZIP before delivery without extracting it over a workspace</title><link href="https://batulabnotes.netlify.app/articles/inspect-a-zip-before-delivery-without-extracting-it-over-a-workspace/" /><updated>2026-09-08T17:55:03.595016+00:00</updated><summary>namelist lists recorded members and read returns bytes for a selected member. The example checks both while the ZipFile is open and never calls extract, so no archive mem</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/reject-archive-entries-that-would.html</id><title>Reject archive entries that would escape an extraction folder</title><link href="https://batulabnotes.netlify.app/articles/reject-archive-entries-that-would-escape-an-extraction-folder/" /><updated>2026-09-08T17:55:03.595167+00:00</updated><summary>The candidate target is formed below the extraction root and resolved before any write. relative_to accepts it only when it remains under that root; a parent-path candida</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-content-hashes-to-identify-reviewed.html</id><title>Use content hashes to identify a reviewed downloadable artifact</title><link href="https://batulabnotes.netlify.app/articles/use-content-hashes-to-identify-a-reviewed-downloadable-artifact/" /><updated>2026-09-08T17:55:03.595306+00:00</updated><summary>sha256 consumes the temporary artifact bytes, and hexdigest exposes a 64-character hexadecimal digest. The script checks that full width while printing a shorter display </summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/design-file-processing-cli-around.html</id><title>Design a file-processing CLI around explicit modes</title><link href="https://batulabnotes.netlify.app/articles/design-a-file-processing-cli-around-explicit-modes/" /><updated>2026-09-08T17:55:03.595458+00:00</updated><summary>add_subparsers stores the chosen command in mode, and required=True makes no-mode invocations argparse usage errors. add_parser registers inspect, so the explicit argv pr</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/explain-why-report-cannot-guarantee.html</id><title>Explain why a report cannot guarantee privacy</title><link href="https://batulabnotes.netlify.app/articles/explain-why-a-report-cannot-guarantee-privacy/" /><updated>2026-09-08T17:55:03.595660+00:00</updated><summary>The dictionary deliberately contains Path.name and a calculated line count. It omits temporary parent paths and the source text itself, which makes the exact report schem</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/test-filesystem-failure-paths-without.html</id><title>Test filesystem failure paths without changing permissions</title><link href="https://batulabnotes.netlify.app/articles/test-filesystem-failure-paths-without-changing-permissions/" /><updated>2026-09-08T17:55:03.595968+00:00</updated><summary>Path.write_text tries to open its target for text output. A directory made in TemporaryDirectory supplies a controlled failure without changing permissions or touching a </summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/choose-stable-error-vocabulary-for.html</id><title>Choose a stable error vocabulary for a local CLI</title><link href="https://batulabnotes.netlify.app/articles/choose-a-stable-error-vocabulary-for-a-local-cli/" /><updated>2026-09-08T17:55:03.596136+00:00</updated><summary>Path.exists observes the synthetic candidate before processing. The false result becomes the fixed token missing-input, so an automation client can react to a documented </summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/choose-request-key-before-adding-sqlite.html</id><title>Choose a request key before adding a SQLite uniqueness constraint</title><link href="https://batulabnotes.netlify.app/articles/choose-a-request-key-before-adding-a-sqlite-uniqueness-constraint/" /><updated>2026-09-08T17:55:03.596295+00:00</updated><summary>UNIQUE(owner, request_key) makes the pair the queue identity. The repeated pair raises IntegrityError and the count remains one, while a different owner could use the sam</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-sqlite-upsert-to-make-enqueue.html</id><title>Use SQLite UPSERT to make enqueue retries explicit</title><link href="https://batulabnotes.netlify.app/articles/use-sqlite-upsert-to-make-enqueue-retries-explicit/" /><updated>2026-09-08T17:55:03.596474+00:00</updated><summary>The first execution inserts r1 with zero retries. The second conflicts on request_key and executes DO UPDATE, which increments retries. Because payload is not named in th</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/explain-why-claimed-queue-job-is-not.html</id><title>Explain why a claimed queue job is not a completed job</title><link href="https://batulabnotes.netlify.app/articles/explain-why-a-claimed-queue-job-is-not-a-completed-job/" /><updated>2026-09-08T17:55:03.596611+00:00</updated><summary>The conditional UPDATE changes queued to claimed, and commit persists that state. The assertions then show claimed and not completed because no completion operation appea</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/add-lease-expiry-field-to-sqlite-job.html</id><title>Add a lease-expiry field to a SQLite job record</title><link href="https://batulabnotes.netlify.app/articles/add-a-lease-expiry-field-to-a-sqlite-job-record/" /><updated>2026-09-08T17:55:03.596743+00:00</updated><summary>The UPDATE requires claimed state and lease_until less than synthetic now, so the row at 100 returns to queued at 101. rowcount and the SELECT confirm one conditional rec</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-placeholders-for-sqlite-queue-inputs.html</id><title>Use placeholders for SQLite queue inputs</title><link href="https://batulabnotes.netlify.app/articles/use-placeholders-for-sqlite-queue-inputs/" /><updated>2026-09-08T17:55:03.596879+00:00</updated><summary>The question mark is a placeholder and (key,) is a one-item parameter tuple. The apostrophe and semicolon in the request key round-trip unchanged because Connection.execu</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/compare-begin-modes-for-local-sqlite.html</id><title>Compare BEGIN modes for a local SQLite worker design</title><link href="https://batulabnotes.netlify.app/articles/compare-begin-modes-for-a-local-sqlite-worker-design/" /><updated>2026-09-08T17:55:03.597073+00:00</updated><summary>The script opens DEFERRED and IMMEDIATE transactions and checks in_transaction. Deferred waits for the first write to seek write access; IMMEDIATE seeks it at BEGIN, whic</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/handle-sqlite-busy-errors-without.html</id><title>Handle SQLite busy errors without claiming infinite retries are safe</title><link href="https://batulabnotes.netlify.app/articles/handle-sqlite-busy-errors-without-claiming-infinite-retries-are-safe/" /><updated>2026-09-08T17:55:03.597222+00:00</updated><summary>The first connection takes an exclusive transaction. The second uses timeout=0, so its INSERT immediately raises OperationalError when locked. finally rolls back and clos</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/keep-queue-claim-selection-and-update.html</id><title>Keep a queue claim selection and update in one transaction</title><link href="https://batulabnotes.netlify.app/articles/keep-a-queue-claim-selection-and-update-in-one-transaction/" /><updated>2026-09-08T17:55:03.597384+00:00</updated><summary>BEGIN IMMEDIATE starts the local write transaction before the oldest queued id is selected. The UPDATE repeats state = queued while setting that id to claimed, and rowcou</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-check-constraint-for-allowed-sqlite.html</id><title>Use a CHECK constraint for allowed SQLite queue states</title><link href="https://batulabnotes.netlify.app/articles/use-a-check-constraint-for-allowed-sqlite-queue-states/" /><updated>2026-09-08T17:55:03.597620+00:00</updated><summary>The CHECK expression allows queued, claimed, and done; invented raises IntegrityError while the valid row remains. Pair CHECK with NOT NULL when every row must hold one l</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/add-foreign-key-to-associate-queue-job.html</id><title>Add a foreign key to associate a queue job with an owner record</title><link href="https://batulabnotes.netlify.app/articles/add-a-foreign-key-to-associate-a-queue-job-with-an-owner-record/" /><updated>2026-09-08T17:55:03.597800+00:00</updated><summary>REFERENCES owner(id) describes the relation, while PRAGMA foreign_keys = ON enables its enforcement on this connection. The missing owner is rejected; after owner 1 exist</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/store-queue-payload-references-instead.html</id><title>Store queue payload references instead of oversized payload blobs</title><link href="https://batulabnotes.netlify.app/articles/store-queue-payload-references-instead-of-oversized-payload-blobs/" /><updated>2026-09-08T17:55:03.597959+00:00</updated><summary>payload_ref holds a synthetic object-style locator rather than a document body. The bound value round-trips by job id and is short in this fixture, making the indirection</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/create-index-for-exact-sqlite-queue.html</id><title>Create an index for the exact SQLite queue claim query</title><link href="https://batulabnotes.netlify.app/articles/create-an-index-for-the-exact-sqlite-queue-claim-query/" /><updated>2026-09-08T17:55:03.598141+00:00</updated><summary>The index puts state first for the equality predicate and created second for the queue ordering. PRAGMA index_info returns indexed columns in sequence, so the script veri</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-deterministic-ordering-when.html</id><title>Use deterministic ordering when selecting the next queued job</title><link href="https://batulabnotes.netlify.app/articles/use-deterministic-ordering-when-selecting-the-next-queued-job/" /><updated>2026-09-08T17:55:03.598493+00:00</updated><summary>ORDER BY priority, created, id defines the choice. The rows make id 4 lose priority, id 2 lose creation time, and id 3 lose the final id tie to id 1. LIMIT 1 is therefore</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/design-sqlite-queue-timestamps-with.html</id><title>Design SQLite queue timestamps with an explicit clock rule</title><link href="https://batulabnotes.netlify.app/articles/design-sqlite-queue-timestamps-with-an-explicit-clock-rule/" /><updated>2026-09-08T17:55:03.598802+00:00</updated><summary>The aware datetime uses timezone.utc and isoformat renders +00:00. The script writes that exact TEXT value through a SQLite placeholder and reads it back, making the crea</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/record-retry-count-without-turning.html</id><title>Record a retry count without turning every error into a retry</title><link href="https://batulabnotes.netlify.app/articles/record-a-retry-count-without-turning-every-error-into-a-retry/" /><updated>2026-09-08T17:55:03.599007+00:00</updated><summary>The statement increments retries only for rows that are failed and retryable. rowcount is one, and the final rows show the permanent failure stayed unchanged. Classificat</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-savepoint-for-one-optional-local.html</id><title>Use a savepoint for one optional local queue side effect</title><link href="https://batulabnotes.netlify.app/articles/use-a-savepoint-for-one-optional-local-queue-side-effect/" /><updated>2026-09-08T17:55:03.599304+00:00</updated><summary>The outer transaction contains the job insert. SAVEPOINT surrounds the audit insert; ROLLBACK TO removes that row, RELEASE removes the marker, and outer commit persists t</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/run-pragma-integritycheck-as-local.html</id><title>Run PRAGMA integrity_check as local maintenance evidence</title><link href="https://batulabnotes.netlify.app/articles/run-pragma-integrity-check-as-local-maintenance-evidence/" /><updated>2026-09-08T17:55:03.599505+00:00</updated><summary>Use PRAGMA integrity_check on a disposable SQLite file and report its single result without treating it as application validation.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/choose-wal-mode-only-after-testing.html</id><title>Choose WAL mode only after testing the local workload</title><link href="https://batulabnotes.netlify.app/articles/choose-wal-mode-only-after-testing-local-workload/" /><updated>2026-09-08T17:55:03.599784+00:00</updated><summary>Set journal_mode=WAL on a disposable database, verify SQLite accepted it, and treat the result as a local configuration observation.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/make-sqlite-connection-cleanup-reliable.html</id><title>Make SQLite connection cleanup reliable in a worker helper</title><link href="https://batulabnotes.netlify.app/articles/make-sqlite-connection-cleanup-reliable-in-a-worker-helper/" /><updated>2026-09-08T17:55:03.599994+00:00</updated><summary>Close a SQLite connection in finally and use the connection context manager to roll back a failed unit of work.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/store-last-error-summary-without.html</id><title>Store a last-error summary without storing sensitive payloads</title><link href="https://batulabnotes.netlify.app/articles/store-a-last-error-summary-without-storing-sensitive-payloads/" /><updated>2026-09-08T17:55:03.600210+00:00</updated><summary>Redact a known token-shaped fragment before storing a bounded SQLite error summary.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/build-queue-schema-version-table-for.html</id><title>Build a queue schema version table for local migrations</title><link href="https://batulabnotes.netlify.app/articles/build-a-queue-schema-version-table-for-local-migrations/" /><updated>2026-09-08T17:55:03.600379+00:00</updated><summary>Store a schema version in its own table and reject a migration whose starting version is not the one it expects.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/test-duplicate-enqueue-behavior-with.html</id><title>Test duplicate enqueue behavior with a temporary SQLite database</title><link href="https://batulabnotes.netlify.app/articles/test-duplicate-enqueue-behavior-with-a-temporary-sqlite-database/" /><updated>2026-09-08T17:55:03.600533+00:00</updated><summary>Demonstrate that a UNIQUE queue key rejects the second enqueue and leaves one durable row.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-rowfactory-for-readable-sqlite.html</id><title>Use row_factory for readable SQLite inspection output</title><link href="https://batulabnotes.netlify.app/articles/use-row-factory-for-readable-sqlite-inspection-output/" /><updated>2026-09-08T17:55:03.600771+00:00</updated><summary>Set sqlite3.Row at the read boundary so a diagnostic can use column names and still assert the exact selected values.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/explain-why-sqlite-transactions-cannot.html</id><title>Explain why SQLite transactions cannot make an HTTP call atomic</title><link href="https://batulabnotes.netlify.app/articles/explain-why-sqlite-transactions-cannot-make-an-http-call-atomic/" /><updated>2026-09-08T17:55:03.600944+00:00</updated><summary>Record an outbox row in a SQLite transaction and show why a later network action remains a separate failure boundary.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/choose-between-soft-delete-and-terminal.html</id><title>Choose between soft delete and terminal queue states</title><link href="https://batulabnotes.netlify.app/articles/choose-between-soft-delete-and-terminal-queue-states/" /><updated>2026-09-08T17:55:03.601156+00:00</updated><summary>Represent a completed queue record with an explicit terminal state and compare it with a separate soft-delete flag.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/explain-filename-hygiene-score-without.html</id><title>Explain a filename hygiene score without calling it release approval</title><link href="https://batulabnotes.netlify.app/articles/explain-a-filename-hygiene-score-without-calling-it-release-approval/" /><updated>2026-09-08T17:55:03.601374+00:00</updated><summary>Score explicit filename signals and print the missing signals separately.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/check-for-root-readme-without-counting.html</id><title>Check for a root README without counting vendored documentation</title><link href="https://batulabnotes.netlify.app/articles/check-for-a-root-readme-without-counting-vendored-documentation/" /><updated>2026-09-08T17:55:03.601643+00:00</updated><summary>Inspect only the requested root path for README.md, leaving nested vendor documentation out of the signal.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/treat-license-filename-as-signal-not.html</id><title>Treat a license filename as a signal, not legal advice</title><link href="https://batulabnotes.netlify.app/articles/treat-a-license-filename-as-a-signal-not-legal-advice/" /><updated>2026-09-08T17:55:03.601812+00:00</updated><summary>Report the presence of a top-level LICENSE file without parsing its text or inferring legal suitability.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/recognize-test-filename-signals-without.html</id><title>Recognize test filename signals without running tests</title><link href="https://batulabnotes.netlify.app/articles/recognize-test-filename-signals-without-running-tests/" /><updated>2026-09-08T17:55:03.601974+00:00</updated><summary>Find declared test naming patterns in a synthetic tree while making no execution claim.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/find-version-in-pyprojecttoml-without.html</id><title>Find a version in pyproject.toml without parsing every tool config</title><link href="https://batulabnotes.netlify.app/articles/find-a-version-in-pyproject-toml-without-parsing-every-tool-config/" /><updated>2026-09-08T17:55:03.602126+00:00</updated><summary>Read only [project].version, reporting dynamic and malformed metadata as unavailable.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/read-top-level-packagejson-version.html</id><title>Read top-level package.json version metadata defensively</title><link href="https://batulabnotes.netlify.app/articles/read-top-level-package-json-version-metadata-defensively/" /><updated>2026-09-08T17:55:03.602281+00:00</updated><summary>Parse only a string top-level version and distinguish wrong type from malformed JSON.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/flag-environment-named-files-without.html</id><title>Flag environment-named files without reading their values</title><link href="https://batulabnotes.netlify.app/articles/flag-environment-named-files-without-reading-their-values/" /><updated>2026-09-08T17:55:03.602420+00:00</updated><summary>Report environment-like filenames without reading their values.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/ignore-envexample-while-warning-on.html</id><title>Ignore .env.example while warning on .env.production</title><link href="https://batulabnotes.netlify.app/articles/ignore-env-example-while-warning-on-env-production/" /><updated>2026-09-08T17:55:03.602688+00:00</updated><summary>Apply an explicit filename exception so a template is not reported as an active environment file.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/keep-local-project-scan-inside-its.html</id><title>Keep a local project scan inside its intended directory tree</title><link href="https://batulabnotes.netlify.app/articles/keep-a-local-project-scan-inside-its-intended-directory-tree/" /><updated>2026-09-08T17:55:03.602852+00:00</updated><summary>Skip symbolic links while scanning a temporary project root so an entry cannot redirect traversal outside the intended tree.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/exclude-dependency-and-build-folders.html</id><title>Exclude dependency and build folders from a hygiene scan</title><link href="https://batulabnotes.netlify.app/articles/exclude-dependency-and-build-folders-from-a-hygiene-scan/" /><updated>2026-09-08T17:55:03.602996+00:00</updated><summary>Use a small named ignored-directory set so generated and dependency paths do not dominate a filename scan.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/report-incomplete-filesystem-traversal.html</id><title>Report incomplete filesystem traversal without revealing private paths</title><link href="https://batulabnotes.netlify.app/articles/report-incomplete-filesystem-traversal-without-revealing-private-paths/" /><updated>2026-09-08T17:55:03.603172+00:00</updated><summary>Publish an error count and completeness flag when one synthetic traversal result cannot be inspected.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/format-hygiene-report-for-markdown.html</id><title>Format a hygiene report for Markdown review</title><link href="https://batulabnotes.netlify.app/articles/format-a-hygiene-report-for-markdown-review/" /><updated>2026-09-08T17:55:03.603408+00:00</updated><summary>Render IDs, statuses, details, and limits as separate Markdown fields.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-json-hygiene-reports-in-local.html</id><title>Use JSON hygiene reports in local automation without overclaiming</title><link href="https://batulabnotes.netlify.app/articles/use-json-hygiene-reports-in-local-automation-without-overclaiming/" /><updated>2026-09-08T17:55:03.603593+00:00</updated><summary>Serialize observations without encoding a release decision into the report.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/choose-stable-check-identifiers-for.html</id><title>Choose stable check identifiers for a local reporting tool</title><link href="https://batulabnotes.netlify.app/articles/choose-stable-check-identifiers-for-a-local-reporting-tool/" /><updated>2026-09-08T17:55:03.603764+00:00</updated><summary>Separate immutable check IDs from labels that can change for readers.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/keep-report-output-explicit-in-read.html</id><title>Keep report output explicit in a read-only project scanner</title><link href="https://batulabnotes.netlify.app/articles/keep-report-output-explicit-in-a-read-only-project-scanner/" /><updated>2026-09-08T17:55:03.604235+00:00</updated><summary>Write output outside the scanned project so a report cannot become its own input.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/explain-what-release-checklist-cannot.html</id><title>Explain what a release checklist cannot learn from filenames</title><link href="https://batulabnotes.netlify.app/articles/explain-what-a-release-checklist-cannot-learn-from-filenames/" /><updated>2026-09-08T17:55:03.604447+00:00</updated><summary>Report checked filename signals and named unexamined areas side by side.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/build-sample-project-that-demonstrates.html</id><title>Build a sample project that demonstrates every readiness signal</title><link href="https://batulabnotes.netlify.app/articles/build-a-sample-project-that-demonstrates-every-readiness-signal/" /><updated>2026-09-08T17:55:03.604633+00:00</updated><summary>Create a disposable tree containing the exact filenames a scanner is documented to recognize.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/test-that-environment-file-values-stay.html</id><title>Test that environment-file values stay out of scanner reports</title><link href="https://batulabnotes.netlify.app/articles/test-that-a-readiness-scanner-never-reads-environment-file-values/" /><updated>2026-09-08T17:55:03.604793+00:00</updated><summary>Use a synthetic sentinel to test that a filename report does not expose an environment-file value.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/handle-invalid-toml-in-readiness-scan.html</id><title>Handle invalid TOML in a readiness scan</title><link href="https://batulabnotes.netlify.app/articles/handle-invalid-toml-in-a-readiness-scan/" /><updated>2026-09-08T17:55:03.604934+00:00</updated><summary>Catch TOMLDecodeError and report unavailable metadata instead of deriving a version from broken text.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/decide-whether-missing-readme-is.html</id><title>Decide whether a missing README is a warning or a hard gate</title><link href="https://batulabnotes.netlify.app/articles/decide-whether-a-missing-readme-is-a-warning-or-a-hard-gate/" /><updated>2026-09-08T17:55:03.605071+00:00</updated><summary>Keep a missing README finding separate from the policy that maps it to warning or block.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/make-local-clis-supported-file-name.html</id><title>Make a local CLI’s supported file-name conventions visible</title><link href="https://batulabnotes.netlify.app/articles/make-a-local-clis-supported-file-name-conventions-visible/" /><updated>2026-09-08T17:55:03.605206+00:00</updated><summary>Expose the exact test filename patterns a scanner supports and reject an unsupported near-match.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/avoid-scanning-hidden-dependency.html</id><title>Avoid scanning hidden dependency folders by accident</title><link href="https://batulabnotes.netlify.app/articles/avoid-scanning-hidden-dependency-folders-by-accident/" /><updated>2026-09-08T17:55:03.605437+00:00</updated><summary>Filter exact hidden dependency directory components before reporting source paths.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/reconcile-two-inventory-counts-with.html</id><title>Reconcile two inventory counts with Counter subtraction</title><link href="https://batulabnotes.netlify.app/articles/reconcile-inventory-counts-counter-subtraction/" /><updated>2026-09-08T17:55:03.605618+00:00</updated><summary>Compare physical and ledger inventory counts with positive-only Counter subtraction.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/keep-latest-fixed-size-sensor-window.html</id><title>Keep the latest fixed-size sensor window with deque</title><link href="https://batulabnotes.netlify.app/articles/keep-latest-fixed-size-sensor-window-deque/" /><updated>2026-09-08T17:55:03.605955+00:00</updated><summary>Retain only the newest sensor readings using a bounded deque.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/rotate-on-call-sequence-without.html</id><title>Rotate an on-call sequence without rebuilding a list</title><link href="https://batulabnotes.netlify.app/articles/rotate-on-call-sequence-without-rebuilding-list/" /><updated>2026-09-08T17:55:03.606179+00:00</updated><summary>Advance an on-call rotation in place with deque.rotate().</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/group-event-labels-with-defaultdict.html</id><title>Group event labels with defaultdict</title><link href="https://batulabnotes.netlify.app/articles/group-event-labels-defaultdict/" /><updated>2026-09-08T17:55:03.606347+00:00</updated><summary>Accumulate repeated event labels by event ID with defaultdict(list).</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/layer-request-defaults-with-chainmap.html</id><title>Layer request defaults with ChainMap</title><link href="https://batulabnotes.netlify.app/articles/layer-request-defaults-chainmap/" /><updated>2026-09-08T17:55:03.606503+00:00</updated><summary>Resolve request, service, and baseline settings with explicit ChainMap precedence.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/represent-compact-measurement-row-with.html</id><title>Represent a compact measurement row with namedtuple</title><link href="https://batulabnotes.netlify.app/articles/represent-a-compact-measurement-row-with-namedtuple/" /><updated>2026-09-08T17:55:03.606652+00:00</updated><summary>Create a small immutable measurement row with readable field access using collections.namedtuple.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/move-recently-used-key-to-end-of.html</id><title>Move a recently used key to the end of OrderedDict</title><link href="https://batulabnotes.netlify.app/articles/move-a-recently-used-key-to-the-end-of-ordereddict/" /><updated>2026-09-08T17:55:03.606796+00:00</updated><summary>Refresh a present key's recency and evict the least-recent key with OrderedDict methods.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/reject-invalid-updates-in-small.html</id><title>Reject invalid updates in a small UserDict wrapper</title><link href="https://batulabnotes.netlify.app/articles/reject-invalid-updates-in-a-small-userdict-wrapper/" /><updated>2026-09-08T17:55:03.606951+00:00</updated><summary>Validate keys and bounded integer values in a small collections.UserDict subclass.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/build-inverse-index-from-tags-with.html</id><title>Build an inverse index from tags with defaultdict</title><link href="https://batulabnotes.netlify.app/articles/build-an-inverse-index-from-tags-with-defaultdict/" /><updated>2026-09-08T17:55:03.607357+00:00</updated><summary>Turn item-to-tags data into a tag-to-items inverse index with defaultdict(list).</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/find-most-common-validation-failures.html</id><title>Find the most common validation failures with Counter</title><link href="https://batulabnotes.netlify.app/articles/find-the-most-common-validation-failures-with-counter/" /><updated>2026-09-08T17:55:03.607555+00:00</updated><summary>Count validation error codes and rank the leading categories with collections.Counter.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/consume-queue-from-both-ends-with-deque.html</id><title>Consume a queue from both ends with deque</title><link href="https://batulabnotes.netlify.app/articles/consume-a-queue-from-both-ends-with-deque/" /><updated>2026-09-08T17:55:03.607710+00:00</updated><summary>Use deque to take work from either the left or right end without list front-pop costs.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/preserve-insertion-order-while-counting.html</id><title>Preserve insertion order while counting first appearances</title><link href="https://batulabnotes.netlify.app/articles/preserve-insertion-order-while-counting-first-appearances/" /><updated>2026-09-08T17:55:03.607850+00:00</updated><summary>Count hashable events with Counter while retaining the order in which distinct values first occur.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/merge-local-override-into-nested.html</id><title>Merge a local override into nested configuration lookups</title><link href="https://batulabnotes.netlify.app/articles/merge-a-local-override-into-nested-configuration-lookups/" /><updated>2026-09-08T17:55:03.608011+00:00</updated><summary>Layer a local mapping over environment and default mappings with ChainMap.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/make-immutable-coordinate-record-with.html</id><title>Make an immutable coordinate record with namedtuple</title><link href="https://batulabnotes.netlify.app/articles/make-an-immutable-coordinate-record-with-namedtuple/" /><updated>2026-09-08T17:55:03.608153+00:00</updated><summary>Create a compact coordinate type with named fields and functional updates using namedtuple.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/remove-zero-and-negative-counts-after.html</id><title>Remove zero and negative counts after a Counter update</title><link href="https://batulabnotes.netlify.app/articles/remove-zero-and-negative-counts-after-a-counter-update/" /><updated>2026-09-08T17:55:03.608285+00:00</updated><summary>Normalize a Counter after a signed update by applying unary plus.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-deque-maxlen-to-retain-recent.html</id><title>Use deque maxlen to retain recent status changes</title><link href="https://batulabnotes.netlify.app/articles/use-deque-maxlen-to-retain-recent-status-changes/" /><updated>2026-09-08T17:55:03.608658+00:00</updated><summary>Keep a bounded, chronological record of distinct status transitions with collections.deque.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/generate-pairwise-changes-from-sequence.html</id><title>Generate pairwise changes from a sequence</title><link href="https://batulabnotes.netlify.app/articles/generate-pairwise-changes-from-a-sequence/" /><updated>2026-09-08T17:55:03.608834+00:00</updated><summary>Use itertools.pairwise to compare each sequence value with its immediate predecessor.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/split-iterator-into-fixed-size-batches.html</id><title>Split an iterator into fixed-size batches</title><link href="https://batulabnotes.netlify.app/articles/split-an-iterator-into-fixed-size-batches/" /><updated>2026-09-08T17:55:03.608992+00:00</updated><summary>Consume an iterator lazily in fixed maximum-size tuples using itertools.islice.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/filter-repeated-values-while-retaining.html</id><title>Filter repeated values while retaining first order</title><link href="https://batulabnotes.netlify.app/articles/filter-repeated-values-while-retaining-first-order/" /><updated>2026-09-08T17:55:03.609140+00:00</updated><summary>Remove later duplicates with a set while preserving the order of each first occurrence.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/attach-positions-to-values-with.html</id><title>Attach positions to values with enumerate</title><link href="https://batulabnotes.netlify.app/articles/attach-positions-to-values-with-enumerate/" /><updated>2026-09-08T17:55:03.609277+00:00</updated><summary>Add human-facing positions to iterable values with enumerate and a chosen start value.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/zip-parallel-labels-and-values-with.html</id><title>Zip parallel labels and values with strict length checking</title><link href="https://batulabnotes.netlify.app/articles/zip-parallel-labels-values-strict-length-checking/" /><updated>2026-09-08T17:55:03.609420+00:00</updated><summary>Build a configuration mapping while rejecting unequal label and value streams.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/sort-records-by-two-fields-with.html</id><title>Sort records by two fields with operator.itemgetter</title><link href="https://batulabnotes.netlify.app/articles/sort-records-two-fields-operator-itemgetter/" /><updated>2026-09-08T17:55:03.610074+00:00</updated><summary>Order dictionary records by severity and then opening sequence using itemgetter.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/group-category-records-after-sorting.html</id><title>Group category records after sorting them</title><link href="https://batulabnotes.netlify.app/articles/groupby-after-sorting-category-records/" /><updated>2026-09-08T17:55:03.610329+00:00</updated><summary>Make category groups contiguous before grouping them with itertools.groupby.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/flatten-one-level-of-nested-results.html</id><title>Flatten one level of nested results with chain.from_iterable</title><link href="https://batulabnotes.netlify.app/articles/flatten-one-level-nested-results-chain-from-iterable/" /><updated>2026-09-08T17:55:03.610488+00:00</updated><summary>Concatenate outer result collections without recursively flattening their records.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/repeat-fixed-schedule-pattern-with-cycle.html</id><title>Repeat a fixed schedule pattern with cycle</title><link href="https://batulabnotes.netlify.app/articles/repeat-fixed-schedule-pattern-cycle/" /><updated>2026-09-08T17:55:03.610637+00:00</updated><summary>Generate a bounded sequence from a repeating fixed schedule with itertools.cycle.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/bind-stable-unit-conversion-with.html</id><title>Bind a stable unit conversion with functools.partial</title><link href="https://batulabnotes.netlify.app/articles/bind-a-stable-unit-conversion-with-functools-partial/" /><updated>2026-09-08T17:55:03.610795+00:00</updated><summary>Bind source and destination units once to create a focused metres-to-centimetres converter.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/cache-pure-fibonacci-helper-with.html</id><title>Cache a pure Fibonacci helper with lru_cache</title><link href="https://batulabnotes.netlify.app/articles/cache-a-pure-fibonacci-helper-with-lru-cache/" /><updated>2026-09-08T17:55:03.610960+00:00</updated><summary>Memoize a deterministic Fibonacci function with a bounded LRU cache.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-reduce-to-combine-permission-flags.html</id><title>Use reduce to combine permission flags</title><link href="https://batulabnotes.netlify.app/articles/use-reduce-to-combine-permission-flags/" /><updated>2026-09-08T17:55:03.611127+00:00</updated><summary>Fold IntFlag permission selections into one bit mask with functools.reduce.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/normalize-mixed-numeric-inputs-with.html</id><title>Normalize mixed numeric inputs with singledispatch</title><link href="https://batulabnotes.netlify.app/articles/normalize-mixed-numeric-inputs-with-singledispatch/" /><updated>2026-09-08T17:55:03.611414+00:00</updated><summary>Use singledispatch to normalize Decimal, int, and float inputs to finite two-decimal amounts.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/keep-decorator-metadata-with.html</id><title>Keep decorator metadata with functools.wraps</title><link href="https://batulabnotes.netlify.app/articles/keep-decorator-metadata-with-functools-wraps/" /><updated>2026-09-08T17:55:03.611623+00:00</updated><summary>Preserve useful function metadata when a logging decorator returns a wrapper.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/sort-version-like-tuples-with-cmptokey.html</id><title>Sort version-like tuples with cmp_to_key</title><link href="https://batulabnotes.netlify.app/articles/sort-version-like-tuples-with-cmp-to-key/" /><updated>2026-09-08T17:55:03.611782+00:00</updated><summary>Use functools.cmp_to_key to sort dotted numeric version-like strings while treating missing trailing components as zero.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/create-total-ordering-from-equality-and.html</id><title>Create a total ordering from equality and one comparison</title><link href="https://batulabnotes.netlify.app/articles/create-a-total-ordering-from-equality-and-one-comparison/" /><updated>2026-09-08T17:55:03.612081+00:00</updated><summary>Define equality and less-than once, then use functools.total_ordering to supply the remaining rich comparisons.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/memoize-expensive-pure-lookup-with-cache.html</id><title>Memoize an expensive pure lookup with cache</title><link href="https://batulabnotes.netlify.app/articles/memoize-an-expensive-pure-lookup-with-cache/" /><updated>2026-09-08T17:55:03.612228+00:00</updated><summary>Use functools.cache to avoid repeating an unchanged catalog lookup for the same hashable SKU.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/build-keyed-formatter-with-partial.html</id><title>Build a keyed formatter with partial</title><link href="https://batulabnotes.netlify.app/articles/build-a-keyed-formatter-with-partial/" /><updated>2026-09-08T17:55:03.612362+00:00</updated><summary>Freeze a format template with functools.partial and fill its named fields later with str.format_map.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/fold-list-of-small-mappings-without.html</id><title>Fold a list of small mappings without mutation</title><link href="https://batulabnotes.netlify.app/articles/fold-a-list-of-small-mappings-without-mutation/" /><updated>2026-09-08T17:55:03.612891+00:00</updated><summary>Reduce small configuration layers with dict union, producing a new mapping without changing any input layer.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-reduce-with-explicit-identity-for.html</id><title>Use reduce with an explicit identity for an empty input</title><link href="https://batulabnotes.netlify.app/articles/use-reduce-with-an-explicit-identity-for-an-empty-input/" /><updated>2026-09-08T17:55:03.613095+00:00</updated><summary>Use functools.reduce with an explicit identity so an aggregation also handles an empty iterable.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/dispatch-formatter-for-text-and-integer.html</id><title>Dispatch a formatter for text and integer values</title><link href="https://batulabnotes.netlify.app/articles/dispatch-a-formatter-for-text-and-integer-values/" /><updated>2026-09-08T17:55:03.613277+00:00</updated><summary>Register separate singledispatch implementations for str and int formatting while retaining a useful default error.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/clear-lrucache-when-its-source-rule.html</id><title>Clear an lru_cache when its source rule changes</title><link href="https://batulabnotes.netlify.app/articles/clear-an-lru-cache-when-its-source-rule-changes/" /><updated>2026-09-08T17:55:03.613443+00:00</updated><summary>Call cache_clear after changing mutable rule data so lru_cache does not retain values computed under the old rule.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/limit-lrucache-for-bounded-input.html</id><title>Limit an lru_cache for bounded input varieties</title><link href="https://batulabnotes.netlify.app/articles/limit-an-lru-cache-for-bounded-input-varieties/" /><updated>2026-09-08T17:55:03.613603+00:00</updated><summary>Set a finite lru_cache maxsize and observe least-recently-used eviction with a small set of input keys.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/compare-records-with-locale-independent.html</id><title>Compare records with a locale-independent comparison key</title><link href="https://batulabnotes.netlify.app/articles/compare-records-with-a-locale-independent-comparison-key/" /><updated>2026-09-08T17:55:03.613795+00:00</updated><summary>Use Unicode casefold and a tuple key to sort text records deterministically without changing process locale.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/write-timing-decorator-that-preserves.html</id><title>Write a timing decorator that preserves a function name</title><link href="https://batulabnotes.netlify.app/articles/timing-decorator-preserves-function-name/" /><updated>2026-09-08T17:55:03.614031+00:00</updated><summary>A deterministic timing decorator that retains a decorated function's metadata.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/compose-two-pure-transformations.html</id><title>Compose two pure transformations explicitly</title><link href="https://batulabnotes.netlify.app/articles/compose-two-pure-transformations-explicitly/" /><updated>2026-09-08T17:55:03.614273+00:00</updated><summary>Build a small composition function and make transformation order visible.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-partialmethod-for-fixed-validation.html</id><title>Use partialmethod for a fixed validation mode</title><link href="https://batulabnotes.netlify.app/articles/partialmethod-fixed-validation-mode/" /><updated>2026-09-08T17:55:03.614901+00:00</updated><summary>Expose clear validation methods by binding a positional validation mode with partialmethod.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/avoid-caching-function-that-receives.html</id><title>Avoid caching a function that receives mutable input</title><link href="https://batulabnotes.netlify.app/articles/avoid-caching-functions-with-mutable-input/" /><updated>2026-09-08T17:55:03.615407+00:00</updated><summary>Keep a list-taking boundary uncached and memoize an immutable snapshot privately.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/make-immutable-configuration-key-for.html</id><title>Make an immutable configuration key for caching</title><link href="https://batulabnotes.netlify.app/articles/immutable-configuration-key-for-caching/" /><updated>2026-09-08T17:55:03.615577+00:00</updated><summary>Use a frozen dataclass and normalized nested values as a reliable cache key.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-cachedproperty-only-for-stable.html</id><title>Use cached_property only for stable instance state</title><link href="https://batulabnotes.netlify.app/articles/extra-046-use-cached-property-only-for-stable-instance-state/" /><updated>2026-09-08T17:55:03.616140+00:00</updated><summary>Cache a derived value only when the instance data it depends on remains stable.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/sort-null-like-values-last-with-key.html</id><title>Sort null-like values last with a key function</title><link href="https://batulabnotes.netlify.app/articles/extra-047-sort-null-like-values-last-with-a-key-function/" /><updated>2026-09-08T17:55:03.616314+00:00</updated><summary>Use a tuple key to order numbers first and a chosen missing-value marker last.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/turn-binary-predicate-into-reusable.html</id><title>Turn a binary predicate into a reusable filter</title><link href="https://batulabnotes.netlify.app/articles/extra-048-turn-a-binary-predicate-into-a-reusable-filter/" /><updated>2026-09-08T17:55:03.616628+00:00</updated><summary>Bind one side of operator.le with partial to create a one-argument filter predicate.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-reduce-to-compute-checksum-modulo.html</id><title>Use reduce to compute a checksum modulo a base</title><link href="https://batulabnotes.netlify.app/articles/extra-049-use-reduce-to-compute-a-checksum-modulo-a-base/" /><updated>2026-09-08T17:55:03.616763+00:00</updated><summary>Accumulate byte values modulo a base with functools.reduce and an explicit initial value.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/design-pure-normalization-pipeline-for.html</id><title>Design a pure normalization pipeline for display labels</title><link href="https://batulabnotes.netlify.app/articles/extra-050-design-a-pure-normalization-pipeline-for-display-labels/" /><updated>2026-09-08T17:55:03.616932+00:00</updated><summary>Compose Unicode normalization, whitespace cleanup, and display casing without mutating the input.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/create-frozen-dataclass-snapshot-for.html</id><title>Create a frozen dataclass snapshot for a price quote</title><link href="https://batulabnotes.netlify.app/articles/frozen-dataclass-price-quote-snapshot/" /><updated>2026-09-08T17:55:03.617074+00:00</updated><summary>Model a price quote as a frozen dataclass and handle attempted field reassignment.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-dataclass-defaults-safely-with.html</id><title>Use dataclass defaults safely with default_factory</title><link href="https://batulabnotes.netlify.app/articles/dataclass-defaults-with-default-factory/" /><updated>2026-09-08T17:55:03.617333+00:00</updated><summary>Give every dataclass instance its own mutable list and dictionary defaults.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/compare-dataclass-records-by-declared.html</id><title>Compare dataclass records by declared fields</title><link href="https://batulabnotes.netlify.app/articles/compare-dataclass-records-declared-fields/" /><updated>2026-09-08T17:55:03.617465+00:00</updated><summary>Use generated dataclass equality to compare records with matching declared values.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/replace-one-field-in-immutable-dataclass.html</id><title>Replace one field in an immutable dataclass</title><link href="https://batulabnotes.netlify.app/articles/replace-one-field-immutable-dataclass/" /><updated>2026-09-08T17:55:03.617624+00:00</updated><summary>Create a revised frozen dataclass value with dataclasses.replace().</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/store-derived-display-data-outside.html</id><title>Store derived display data outside dataclass equality</title><link href="https://batulabnotes.netlify.app/articles/exclude-derived-display-data-from-dataclass-equality/" /><updated>2026-09-08T17:55:03.617777+00:00</updated><summary>Exclude a presentation-only dataclass field from generated equality with compare=False.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-slots-for-many-small-dataclass.html</id><title>Use slots for many small dataclass instances</title><link href="https://batulabnotes.netlify.app/articles/use-slots-for-many-small-dataclass-instances/" /><updated>2026-09-08T17:55:03.617923+00:00</updated><summary>Use dataclass slots to avoid per-instance attribute dictionaries when an object's attributes are fixed.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/validate-constructor-input-with-postinit.html</id><title>Validate constructor input with __post_init__</title><link href="https://batulabnotes.netlify.app/articles/validate-constructor-input-with-post-init/" /><updated>2026-09-08T17:55:03.618207+00:00</updated><summary>Use a dataclass post-initialization hook to reject invalid constructor values.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/pass-setup-only-input-through-initvar.html</id><title>Pass setup-only input through InitVar</title><link href="https://batulabnotes.netlify.app/articles/pass-setup-only-input-through-initvar/" /><updated>2026-09-08T17:55:03.618355+00:00</updated><summary>Use InitVar to accept constructor-only data without storing it as a dataclass field.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/parse-string-into-enum-member.html</id><title>Parse a string into an enum member deliberately</title><link href="https://batulabnotes.netlify.app/articles/parse-a-string-into-an-enum-member-deliberately/" /><updated>2026-09-08T17:55:03.618603+00:00</updated><summary>Choose enum-name lookup when external input is intended to name an enum member.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/serialize-enum-names-instead-of.html</id><title>Serialize enum names instead of implementation values</title><link href="https://batulabnotes.netlify.app/articles/serialize-enum-names-instead-of-implementation-values/" /><updated>2026-09-08T17:55:03.618767+00:00</updated><summary>Store an enum member's name in JSON when the external format is defined around stable names.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-intflag-to-combine-small-capability.html</id><title>Use IntFlag to combine small capability bits</title><link href="https://batulabnotes.netlify.app/articles/use-intflag-to-combine-small-capability-bits/" /><updated>2026-09-08T17:55:03.618913+00:00</updated><summary>Represent independent, small capabilities as named integer flags and combine them with bitwise OR.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/reject-unknown-flag-bits-at-runtime.html</id><title>Reject unknown flag bits at a runtime boundary</title><link href="https://batulabnotes.netlify.app/articles/reject-unknown-flag-bits-at-a-runtime-boundary/" /><updated>2026-09-08T17:55:03.619095+00:00</updated><summary>Validate an incoming integer mask before converting it to an IntFlag value.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/make-stable-public-state-enum.html</id><title>Make a stable public state enum</title><link href="https://batulabnotes.netlify.app/articles/make-a-stable-public-state-enum/" /><updated>2026-09-08T17:55:03.619291+00:00</updated><summary>Use explicit string values for public state tokens and parse them with Enum value lookup.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-enum-membership-rules-without.html</id><title>Use Enum membership rules without coercing arbitrary input</title><link href="https://batulabnotes.netlify.app/articles/use-enum-membership-rules-without-coercing-arbitrary-input/" /><updated>2026-09-08T17:55:03.619495+00:00</updated><summary>Guard Enum membership checks with an instance check when input may be arbitrary objects.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/check-mapping-shape-before-treating-it.html</id><title>Check a mapping shape before treating it as TypedDict-like</title><link href="https://batulabnotes.netlify.app/articles/check-a-mapping-shape-before-treating-it-as-typeddict-like/" /><updated>2026-09-08T17:55:03.619668+00:00</updated><summary>Validate mapping keys and runtime value types before using incoming data as a TypedDict-shaped record.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-isinstance-only-with-runtime.html</id><title>Use isinstance only with runtime-checkable Protocols</title><link href="https://batulabnotes.netlify.app/articles/use-isinstance-only-with-runtime-checkable-protocols/" /><updated>2026-09-08T17:55:03.619918+00:00</updated><summary>Use a runtime-checkable Protocol for a narrow structural check, while understanding its limits.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/write-typeguard-for-two-item-coordinate.html</id><title>Write a TypeGuard for a two-item coordinate</title><link href="https://batulabnotes.netlify.app/articles/write-a-typeguard-for-a-two-item-coordinate/" /><updated>2026-09-08T17:55:03.620059+00:00</updated><summary>Validate an unknown value as a two-float coordinate with TypeGuard.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/validate-optional-json-like-fields-at.html</id><title>Validate optional JSON-like fields at the boundary</title><link href="https://batulabnotes.netlify.app/articles/validate-optional-json-like-fields-at-the-boundary/" /><updated>2026-09-08T17:55:03.620211+00:00</updated><summary>Convert JSON input into a validated internal settings dictionary at one boundary.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/model-tagged-result-with-dataclasses.html</id><title>Model a tagged result with dataclasses</title><link href="https://batulabnotes.netlify.app/articles/model-a-tagged-result-with-dataclasses/" /><updated>2026-09-08T17:55:03.620372+00:00</updated><summary>Represent successful and failed parsing outcomes as separate dataclasses.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-kwonly-dataclass-fields-to-prevent.html</id><title>Use kw_only dataclass fields to prevent argument swaps</title><link href="https://batulabnotes.netlify.app/articles/use-kw-only-dataclass-fields-to-prevent-argument-swaps/" /><updated>2026-09-08T17:55:03.620522+00:00</updated><summary>Make similar dataclass parameters keyword-only so call sites name their meaning.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/prevent-mutable-default-list-in.html</id><title>Prevent a mutable default list in a dataclass</title><link href="https://batulabnotes.netlify.app/articles/prevent-mutable-default-list-dataclass/" /><updated>2026-09-08T17:55:03.620670+00:00</updated><summary>Create a fresh list per dataclass instance with field(default_factory=list).</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/choose-reprfalse-for-non-display-field.html</id><title>Choose repr=False for a non-display field</title><link href="https://batulabnotes.netlify.app/articles/choose-repr-false-non-display-field/" /><updated>2026-09-08T17:55:03.620906+00:00</updated><summary>Exclude a non-display dataclass field from the generated representation without removing the field itself.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-dataclass-field-metadata-for-labels.html</id><title>Use dataclass field metadata for labels only</title><link href="https://batulabnotes.netlify.app/articles/use-dataclass-field-metadata-for-labels/" /><updated>2026-09-08T17:55:03.621149+00:00</updated><summary>Store presentation labels in dataclass metadata and retrieve them through fields().</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/convert-dataclass-to-dict-without.html</id><title>Convert a dataclass to a dict without assuming deep validation</title><link href="https://batulabnotes.netlify.app/articles/convert-dataclass-to-dict-without-assuming-deep-validation/" /><updated>2026-09-08T17:55:03.621333+00:00</updated><summary>Use dataclasses.asdict() for recursive conversion, while keeping validation as a separate concern.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-literal-like-enum-to-make-command.html</id><title>Use a literal-like enum to make command states explicit</title><link href="https://batulabnotes.netlify.app/articles/use-literal-like-enum-command-states/" /><updated>2026-09-08T17:55:03.621523+00:00</updated><summary>Use StrEnum to name a small set of string command states while retaining string values.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/add-currency-amounts-with-decimal.html</id><title>Add currency amounts with Decimal instead of binary floats</title><link href="https://batulabnotes.netlify.app/articles/add-currency-amounts-with-decimal-instead-of-binary-floats/" /><updated>2026-09-08T17:55:03.621682+00:00</updated><summary>Use Decimal values constructed from strings to add currency-like amounts exactly.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/quantize-decimal-amount-to-two-minor.html</id><title>Quantize a Decimal amount to two minor units</title><link href="https://batulabnotes.netlify.app/articles/quantize-a-decimal-amount-to-two-minor-units/" /><updated>2026-09-08T17:55:03.621827+00:00</updated><summary>Round a Decimal amount to two places with an explicitly selected rounding mode.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/split-decimal-total-with-explicit.html</id><title>Split a Decimal total with an explicit remainder rule</title><link href="https://batulabnotes.netlify.app/articles/split-a-decimal-total-with-an-explicit-remainder-rule/" /><updated>2026-09-08T17:55:03.622088+00:00</updated><summary>Allocate a Decimal total in minor units and assign the leftover unit by a documented rule.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/compare-rational-recipe-ratios-with.html</id><title>Compare rational recipe ratios with Fraction</title><link href="https://batulabnotes.netlify.app/articles/compare-rational-recipe-ratios-with-fraction/" /><updated>2026-09-08T17:55:03.622269+00:00</updated><summary>Compare recipe proportions exactly with Fraction instead of rounded decimal approximations.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/reduce-fraction-after-multiplying.html</id><title>Reduce a Fraction after multiplying portions</title><link href="https://batulabnotes.netlify.app/articles/reduce-a-fraction-after-multiplying-portions/" /><updated>2026-09-08T17:55:03.622514+00:00</updated><summary>Multiply recipe portions with Fraction and use its normalized result.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-mathisclose-for-tolerance-based.html</id><title>Use math.isclose for a tolerance-based measurement check</title><link href="https://batulabnotes.netlify.app/articles/use-math-isclose-for-a-tolerance-based-measurement-check/" /><updated>2026-09-08T17:55:03.622654+00:00</updated><summary>Compare a measured length with its target using an explicit absolute tolerance.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-mathfsum-for-more-accurate-float.html</id><title>Use math.fsum for a more accurate float total</title><link href="https://batulabnotes.netlify.app/articles/use-math-fsum-for-a-more-accurate-float-total/" /><updated>2026-09-08T17:55:03.622859+00:00</updated><summary>Preserve a small contribution in a floating-point total with math.fsum.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/find-common-batch-size-with-gcd.html</id><title>Find a common batch size with gcd</title><link href="https://batulabnotes.netlify.app/articles/find-a-common-batch-size-with-gcd/" /><updated>2026-09-08T17:55:03.623053+00:00</updated><summary>Use math.gcd to calculate the largest equal batch size for several integer counts.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/find-repeating-schedule-interval-with.html</id><title>Find a repeating schedule interval with lcm</title><link href="https://batulabnotes.netlify.app/articles/find-a-repeating-schedule-interval-with-lcm/" /><updated>2026-09-08T17:55:03.623286+00:00</updated><summary>Calculate when integer-minute recurring jobs next align with math.lcm.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-median-to-summarize-skewed-durations.html</id><title>Use median to summarize skewed durations</title><link href="https://batulabnotes.netlify.app/articles/use-median-to-summarize-skewed-durations/" /><updated>2026-09-08T17:55:03.623475+00:00</updated><summary>Summarize typical request duration with statistics.median when one run is unusually slow.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-medianlow-for-discrete-middle-choice.html</id><title>Use median_low for a discrete middle choice</title><link href="https://batulabnotes.netlify.app/articles/use-median-low-for-a-discrete-middle-choice/" /><updated>2026-09-08T17:55:03.623918+00:00</updated><summary>Select the lower actual observation from an even-sized discrete ranking.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/report-mode-only-when-it-is-unique.html</id><title>Report the mode only when it is unique</title><link href="https://batulabnotes.netlify.app/articles/report-the-mode-only-when-it-is-unique/" /><updated>2026-09-08T17:55:03.624138+00:00</updated><summary>Avoid presenting a tie as a single most-common category.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/compute-sample-variance-for-small.html</id><title>Compute sample variance for a small measurement set</title><link href="https://batulabnotes.netlify.app/articles/compute-sample-variance-for-a-small-measurement-set/" /><updated>2026-09-08T17:55:03.624279+00:00</updated><summary>Calculate Bessel-corrected variance from a small sample using exact fractions.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/distinguish-population-and-sample.html</id><title>Distinguish population and sample standard deviation</title><link href="https://batulabnotes.netlify.app/articles/distinguish-population-and-sample-standard-deviation/" /><updated>2026-09-08T17:55:03.624411+00:00</updated><summary>Choose the standard-deviation denominator that matches whether data is a population or sample.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/build-every-two-person-review-pair-with.html</id><title>Build every two-person review pair with combinations</title><link href="https://batulabnotes.netlify.app/articles/build-every-two-person-review-pair-with-combinations/" /><updated>2026-09-08T17:55:03.624543+00:00</updated><summary>Generate unordered reviewer pairs without self-pairs or reversed duplicates.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/generate-ordered-assignment-options.html</id><title>Generate ordered assignment options with permutations</title><link href="https://batulabnotes.netlify.app/articles/generate-ordered-assignment-options-with-permutations/" /><updated>2026-09-08T17:55:03.624826+00:00</updated><summary>Use itertools.permutations to list distinct ordered assignments from a small pool.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/enumerate-small-option-grid-with-product.html</id><title>Enumerate a small option grid with product</title><link href="https://batulabnotes.netlify.app/articles/enumerate-a-small-option-grid-with-product/" /><updated>2026-09-08T17:55:03.625050+00:00</updated><summary>Use itertools.product to enumerate every choice in a compact configuration grid.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/count-combinations-before-materializing.html</id><title>Count combinations before materializing them</title><link href="https://batulabnotes.netlify.app/articles/count-combinations-before-materializing-them/" /><updated>2026-09-08T17:55:03.625360+00:00</updated><summary>Use math.comb to calculate a combination count before building tuple results.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-combinationswithreplacement-for.html</id><title>Use combinations_with_replacement for menu bundles</title><link href="https://batulabnotes.netlify.app/articles/use-combinations-with-replacement-for-menu-bundles/" /><updated>2026-09-08T17:55:03.625518+00:00</updated><summary>Model unordered menu bundles that may include repeated items with combinations_with_replacement.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/generate-running-total-with-accumulate.html</id><title>Generate a running total with accumulate</title><link href="https://batulabnotes.netlify.app/articles/generate-a-running-total-with-accumulate/" /><updated>2026-09-08T17:55:03.625750+00:00</updated><summary>Use itertools.accumulate to turn a sequence of changes into deterministic running totals.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/clamp-numeric-input-to-chosen-interval.html</id><title>Clamp a numeric input to a chosen interval</title><link href="https://batulabnotes.netlify.app/articles/clamp-a-numeric-input-to-a-chosen-interval/" /><updated>2026-09-08T17:55:03.625878+00:00</updated><summary>Use max() and min() to keep a numeric value within inclusive bounds.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/convert-degrees-to-radians-for-math-api.html</id><title>Convert degrees to radians for a math API</title><link href="https://batulabnotes.netlify.app/articles/convert-degrees-to-radians-for-a-math-api/" /><updated>2026-09-08T17:55:03.626009+00:00</updated><summary>Convert a degree measurement with math.radians() before calling a trigonometric function.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-integer-square-root-for-capacity.html</id><title>Use integer square root for a capacity estimate</title><link href="https://batulabnotes.netlify.app/articles/use-integer-square-root-for-a-capacity-estimate/" /><updated>2026-09-08T17:55:03.626132+00:00</updated><summary>Use math.isqrt() to find the largest square capacity that fits an integer budget.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/check-finite-numeric-input-before.html</id><title>Check finite numeric input before processing</title><link href="https://batulabnotes.netlify.app/articles/check-finite-numeric-input-before-processing/" /><updated>2026-09-08T17:55:03.626264+00:00</updated><summary>Reject NaN and infinities with math.isfinite() before a numeric calculation.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/compute-weighted-mean-without-losing.html</id><title>Compute a weighted mean without losing its denominator</title><link href="https://batulabnotes.netlify.app/articles/compute-a-weighted-mean-without-losing-its-denominator/" /><updated>2026-09-08T17:55:03.626451+00:00</updated><summary>Divide the weighted total by the sum of weights, not by the number of values.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/convert-utc-timestamp-to-named-time-zone.html</id><title>Convert a UTC timestamp to a named time zone</title><link href="https://batulabnotes.netlify.app/articles/convert-a-utc-timestamp-to-a-named-time-zone/" /><updated>2026-09-08T17:55:03.626609+00:00</updated><summary>Convert an aware UTC datetime to a named IANA time zone with zoneinfo.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/keep-instant-in-utc-while-displaying.html</id><title>Keep an instant in UTC while displaying local time</title><link href="https://batulabnotes.netlify.app/articles/keep-an-instant-in-utc-while-displaying-local-time/" /><updated>2026-09-08T17:55:03.626747+00:00</updated><summary>Store an aware UTC instant and derive a viewer-specific local display value.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/parse-iso-8601-date-before-calendar.html</id><title>Parse an ISO 8601 date before a calendar calculation</title><link href="https://batulabnotes.netlify.app/articles/parse-an-iso-8601-date-before-a-calendar-calculation/" /><updated>2026-09-08T17:55:03.626957+00:00</updated><summary>Parse an ISO 8601 date string before using its year and month in calendar functions.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/find-first-and-last-day-of-month.html</id><title>Find the first and last day of a month</title><link href="https://batulabnotes.netlify.app/articles/find-the-first-and-last-day-of-a-month/" /><updated>2026-09-08T17:55:03.627094+00:00</updated><summary>Use calendar.monthrange to construct deterministic first and last date objects.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/generate-monday-first-month-grid-with.html</id><title>Generate a Monday-first month grid with calendar</title><link href="https://batulabnotes.netlify.app/articles/generate-a-monday-first-month-grid-with-calendar/" /><updated>2026-09-08T17:55:03.627229+00:00</updated><summary>Build and print a Monday-first month grid using calendar.Calendar.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/compare-aware-datetimes-only-after.html</id><title>Compare aware datetimes only after choosing time zones</title><link href="https://batulabnotes.netlify.app/articles/compare-aware-datetimes-after-choosing-time-zones/" /><updated>2026-09-08T17:55:03.627365+00:00</updated><summary>Convert aware datetimes to UTC before comparing their instants.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/represent-date-only-deadline-without.html</id><title>Represent a date-only deadline without a time component</title><link href="https://batulabnotes.netlify.app/articles/represent-a-date-only-deadline-without-a-time-component/" /><updated>2026-09-08T17:55:03.627521+00:00</updated><summary>Model a calendar deadline with datetime.date instead of an invented midnight.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/add-business-days-while-skipping.html</id><title>Add business days while skipping weekends</title><link href="https://batulabnotes.netlify.app/articles/add-business-days-while-skipping-weekends/" /><updated>2026-09-08T17:55:03.627662+00:00</updated><summary>Count weekdays while advancing dates one calendar day at a time.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/find-next-weekday-from-given-date.html</id><title>Find the next weekday from a given date</title><link href="https://batulabnotes.netlify.app/articles/find-the-next-weekday-from-a-given-date/" /><updated>2026-09-08T17:55:03.627790+00:00</updated><summary>Calculate the strictly next requested weekday with modular arithmetic.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/group-timestamps-by-calendar-day-in-utc.html</id><title>Group timestamps by calendar day in UTC</title><link href="https://batulabnotes.netlify.app/articles/group-timestamps-by-calendar-day-in-utc/" /><updated>2026-09-08T17:55:03.628104+00:00</updated><summary>Normalize aware timestamps to UTC, then use their dates as grouping keys.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/format-duration-without-calling-it-wall.html</id><title>Format a duration without calling it a wall-clock time</title><link href="https://batulabnotes.netlify.app/articles/format-a-duration-without-calling-it-a-wall-clock-time/" /><updated>2026-09-08T17:55:03.628314+00:00</updated><summary>Format a timedelta as an elapsed duration with explicit sign and total hours.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-timedelta-floor-division-for-whole.html</id><title>Use timedelta floor division for whole intervals</title><link href="https://batulabnotes.netlify.app/articles/use-timedelta-floor-division-for-whole-intervals/" /><updated>2026-09-08T17:55:03.628493+00:00</updated><summary>Count complete 15-minute intervals and retain an exact timedelta remainder.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/detect-invalid-calendar-date-from-user.html</id><title>Detect an invalid calendar date from user text</title><link href="https://batulabnotes.netlify.app/articles/detect-an-invalid-calendar-date-from-user-text/" /><updated>2026-09-08T17:55:03.628660+00:00</updated><summary>Use date.fromisoformat and ValueError to distinguish valid and impossible ISO calendar dates.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/explain-dst-fold-ambiguity-with-two.html</id><title>Explain DST fold ambiguity with two explicit instants</title><link href="https://batulabnotes.netlify.app/articles/explain-dst-fold-ambiguity-with-two-explicit-instants/" /><updated>2026-09-08T17:55:03.628826+00:00</updated><summary>Convert two UTC instants to the repeated local hour and inspect the fold attribute.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/avoid-assuming-every-local-wall-time.html</id><title>Avoid assuming every local wall time exists</title><link href="https://batulabnotes.netlify.app/articles/avoid-assuming-every-local-wall-time-exists/" /><updated>2026-09-08T17:55:03.629004+00:00</updated><summary>Round-trip a local candidate through UTC to detect a daylight-saving gap.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/build-rolling-seven-day-date-range.html</id><title>Build a rolling seven-day date range</title><link href="https://batulabnotes.netlify.app/articles/build-a-rolling-seven-day-date-range/" /><updated>2026-09-08T17:55:03.629244+00:00</updated><summary>Create an inclusive seven-day reporting window ending on a supplied date.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/calculate-age-on-date-without-day-count.html</id><title>Calculate age on a date without day-count shortcuts</title><link href="https://batulabnotes.netlify.app/articles/calculate-age-on-a-date-without-day-count-shortcuts/" /><updated>2026-09-08T17:55:03.629680+00:00</updated><summary>Calculate completed calendar years while handling a stated leap-day birthday policy.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/find-iso-week-label-for-reporting-date.html</id><title>Find an ISO week label for a reporting date</title><link href="https://batulabnotes.netlify.app/articles/find-an-iso-week-label-for-a-reporting-date/" /><updated>2026-09-08T17:55:03.629927+00:00</updated><summary>Format a reporting date using its ISO week-year and week number.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/convert-year-and-week-back-to-its-monday.html</id><title>Convert a year and week back to its Monday</title><link href="https://batulabnotes.netlify.app/articles/convert-a-year-and-week-back-to-its-monday/" /><updated>2026-09-08T17:55:03.630132+00:00</updated><summary>Reconstruct the Monday of a valid ISO year and week.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/normalize-list-of-dict-records-by.html</id><title>Normalize a list of dict records by selected keys</title><link href="https://batulabnotes.netlify.app/articles/normalize-a-list-of-dict-records-by-selected-keys/" /><updated>2026-09-08T17:55:03.630327+00:00</updated><summary>Project dictionary records into a consistent selected-key shape with explicit missing values.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/transpose-small-rectangular-matrix-with.html</id><title>Transpose a small rectangular matrix with zip strict</title><link href="https://batulabnotes.netlify.app/articles/transpose-small-rectangular-matrix-zip-strict/" /><updated>2026-09-08T17:55:03.630543+00:00</updated><summary>Use zip(..., strict=True) to transpose a validated small rectangular matrix.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/merge-two-sorted-number-streams.html</id><title>Merge two sorted number streams deterministically</title><link href="https://batulabnotes.netlify.app/articles/merge-two-sorted-number-streams-deterministically/" /><updated>2026-09-08T17:55:03.630705+00:00</updated><summary>Merge ascending numeric iterables with heapq.merge without sorting their combined contents.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/partition-records-into-accepted-and.html</id><title>Partition records into accepted and rejected lists</title><link href="https://batulabnotes.netlify.app/articles/partition-records-accepted-rejected-lists/" /><updated>2026-09-08T17:55:03.630857+00:00</updated><summary>Classify ordered score records into two lists with an explicit threshold.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/flatten-nested-batches-while-preserving.html</id><title>Flatten nested batches while preserving order</title><link href="https://batulabnotes.netlify.app/articles/flatten-nested-batches-preserving-order/" /><updated>2026-09-08T17:55:03.631187+00:00</updated><summary>Flatten one level of batches in encounter order with itertools.chain.from_iterable.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/create-deterministic-unique-labels-with.html</id><title>Create deterministic unique labels with suffixes</title><link href="https://batulabnotes.netlify.app/articles/create-deterministic-unique-labels-suffixes/" /><updated>2026-09-08T17:55:03.631330+00:00</updated><summary>Create globally unique labels in encounter order, adding numeric suffixes while avoiding pre-existing suffix-shaped names.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/reject-path-that-escapes-temporary.html</id><title>Reject a path that escapes a temporary workspace</title><link href="https://batulabnotes.netlify.app/articles/reject-path-that-escapes-a-temporary-workspace/" /><updated>2026-09-08T17:55:03.631495+00:00</updated><summary>Resolve a candidate path and require it to be relative to the resolved temporary workspace.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/list-only-direct-report-files-by-suffix.html</id><title>List only direct report files by suffix</title><link href="https://batulabnotes.netlify.app/articles/list-only-direct-report-files-by-suffix/" /><updated>2026-09-08T17:55:03.631653+00:00</updated><summary>Use iterdir, is_file, and suffix to select direct CSV report files without descending into subdirectories.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/replace-final-suffix-of-generated-report.html</id><title>Replace the final suffix of a generated report</title><link href="https://batulabnotes.netlify.app/articles/replace-the-final-suffix-of-a-generated-report/" /><updated>2026-09-08T17:55:03.631806+00:00</updated><summary>Use Path.with_suffix to derive a JSON report name from a text report while preserving earlier dots.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/preserve-double-suffix-while-naming.html</id><title>Preserve a double suffix while naming an archive</title><link href="https://batulabnotes.netlify.app/articles/preserve-a-double-suffix-while-naming-an-archive/" /><updated>2026-09-08T17:55:03.632143+00:00</updated><summary>Use suffixes and removesuffix to insert an archive label before a compound .tar.gz suffix.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/create-missing-nested-output-directory.html</id><title>Create a missing nested output directory</title><link href="https://batulabnotes.netlify.app/articles/create-a-missing-nested-output-directory/" /><updated>2026-09-08T17:55:03.632394+00:00</updated><summary>Create all absent output-directory parents with Path.mkdir(parents=True, exist_ok=True).</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/write-utf-8-manifest-into-temporary.html</id><title>Write a UTF-8 manifest into a temporary folder</title><link href="https://batulabnotes.netlify.app/articles/write-utf-8-manifest-temporary-folder/" /><updated>2026-09-08T17:55:03.632708+00:00</updated><summary>Write a compact UTF-8 JSON manifest in an automatically cleaned temporary directory.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/read-small-text-fixture-with-explicit.html</id><title>Read a small text fixture with an explicit encoding</title><link href="https://batulabnotes.netlify.app/articles/read-small-text-fixture-explicit-encoding/" /><updated>2026-09-08T17:55:03.632932+00:00</updated><summary>Decode controlled UTF-8 fixture bytes with an explicit encoding.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/find-relative-path-below-known-root.html</id><title>Find a relative path below a known root</title><link href="https://batulabnotes.netlify.app/articles/find-relative-path-below-known-root/" /><updated>2026-09-08T17:55:03.633117+00:00</updated><summary>Derive a project-relative descendant path with Path.relative_to.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/sort-temporary-report-paths-by-filename.html</id><title>Sort temporary report paths by filename</title><link href="https://batulabnotes.netlify.app/articles/sort-temporary-report-paths-by-filename/" /><updated>2026-09-08T17:55:03.633378+00:00</updated><summary>Sort Path objects by their final filename for a deterministic report order.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/detect-directory-where-file-is-required.html</id><title>Detect a directory where a file is required</title><link href="https://batulabnotes.netlify.app/articles/detect-directory-where-file-required/" /><updated>2026-09-08T17:55:03.634496+00:00</updated><summary>Distinguish a directory from a required regular-file path with pathlib checks.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/build-platform-neutral-cache-path.html</id><title>Build a platform-neutral cache path</title><link href="https://batulabnotes.netlify.app/articles/build-a-platform-neutral-cache-path/" /><updated>2026-09-08T17:55:03.634676+00:00</updated><summary>Construct equivalent cache keys for POSIX and Windows path flavours without filesystem access.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-pureposixpath-to-inspect-archive.html</id><title>Use PurePosixPath to inspect an archive member</title><link href="https://batulabnotes.netlify.app/articles/use-pureposixpath-to-inspect-an-archive-member/" /><updated>2026-09-08T17:55:03.634977+00:00</updated><summary>Inspect a slash-delimited archive member name lexically with PurePosixPath.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/keep-source-fixture-and-derived-file.html</id><title>Keep a source fixture and derived file separate</title><link href="https://batulabnotes.netlify.app/articles/keep-a-source-fixture-and-derived-file-separate/" /><updated>2026-09-08T17:55:03.635357+00:00</updated><summary>Use distinct paths for fixture input and generated output inside a temporary workspace.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/create-unique-temporary-work-directory.html</id><title>Create a unique temporary work directory</title><link href="https://batulabnotes.netlify.app/articles/create-a-unique-temporary-work-directory/" /><updated>2026-09-08T17:55:03.635542+00:00</updated><summary>Use TemporaryDirectory as an isolated work area with automatic cleanup.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/write-atomic-looking-staging-file.html</id><title>Write an atomic-looking staging file within one directory</title><link href="https://batulabnotes.netlify.app/articles/write-an-atomic-looking-staging-file-within-one-directory/" /><updated>2026-09-08T17:55:03.635731+00:00</updated><summary>Stage replacement content beside its target, then commit it with Path.replace.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/archive-two-generated-text-members-with.html</id><title>Archive two generated text members with zipfile</title><link href="https://batulabnotes.netlify.app/articles/archive-two-generated-text-members-with-zipfile/" /><updated>2026-09-08T17:55:03.635901+00:00</updated><summary>Create a temporary ZIP containing two generated UTF-8 text members and verify their contents.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/list-zip-member-names-without-extracting.html</id><title>List ZIP member names without extracting</title><link href="https://batulabnotes.netlify.app/articles/list-zip-member-names-without-extracting/" /><updated>2026-09-08T17:55:03.636076+00:00</updated><summary>Read and print ZIP member names from central-directory metadata without extracting files.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/reject-unsafe-zip-member-names-before.html</id><title>Reject unsafe ZIP member names before extraction</title><link href="https://batulabnotes.netlify.app/articles/reject-unsafe-zip-member-names-before-extraction/" /><updated>2026-09-08T17:55:03.636260+00:00</updated><summary>Apply a conservative member-name policy before any ZIP extraction is attempted.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/verify-zip-archive-with-testzip.html</id><title>Verify a ZIP archive with testzip</title><link href="https://batulabnotes.netlify.app/articles/verify-a-zip-archive-with-testzip/" /><updated>2026-09-08T17:55:03.636427+00:00</updated><summary>Check every member of a temporary ZIP archive with ZipFile.testzip.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/read-one-zip-member-as-text.html</id><title>Read one ZIP member as text</title><link href="https://batulabnotes.netlify.app/articles/read-one-zip-member-as-text/" /><updated>2026-09-08T17:55:03.636717+00:00</updated><summary>Open a selected ZIP member as bytes, decode UTF-8, and print the exact text.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/round-trip-gzip-compressed-text-fixture.html</id><title>Round-trip a gzip-compressed text fixture</title><link href="https://batulabnotes.netlify.app/articles/round-trip-a-gzip-compressed-text-fixture/" /><updated>2026-09-08T17:55:03.636935+00:00</updated><summary>Compress and restore a UTF-8 text fixture entirely in memory with gzip.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/round-trip-bz2-compressed-text-fixture.html</id><title>Round-trip a bz2-compressed text fixture</title><link href="https://batulabnotes.netlify.app/articles/round-trip-a-bz2-compressed-text-fixture/" /><updated>2026-09-08T17:55:03.637104+00:00</updated><summary>Create a bzip2 text fixture in memory and verify its restored content.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/round-trip-lzma-compressed-text-fixture.html</id><title>Round-trip an lzma-compressed text fixture</title><link href="https://batulabnotes.netlify.app/articles/round-trip-an-lzma-compressed-text-fixture/" /><updated>2026-09-08T17:55:03.637263+00:00</updated><summary>Use an in-memory XZ fixture and verify its LZMA decompression result.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/limit-in-memory-tar-member-name-to-safe.html</id><title>Limit an in-memory tar member name to a safe relative path</title><link href="https://batulabnotes.netlify.app/articles/limit-an-in-memory-tar-member-name-to-a-safe-relative-path/" /><updated>2026-09-08T17:55:03.637427+00:00</updated><summary>Validate a portable relative tar member name before adding an in-memory file.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/compare-compressed-bytes-only-after.html</id><title>Compare compressed bytes only after decompression</title><link href="https://batulabnotes.netlify.app/articles/compare-compressed-bytes-only-after-decompression/" /><updated>2026-09-08T17:55:03.637587+00:00</updated><summary>Demonstrate content comparison for gzip streams with different encoded bytes.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/parse-required-local-input-name-with.html</id><title>Parse a required local input name with argparse</title><link href="https://batulabnotes.netlify.app/articles/parse-required-local-input-name-argparse/" /><updated>2026-09-08T17:55:03.637731+00:00</updated><summary>Define a required positional local input name and read it from argparse's Namespace.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-argparse-choices-for-report-format.html</id><title>Use argparse choices for a report format</title><link href="https://batulabnotes.netlify.app/articles/use-argparse-choices-for-report-format/" /><updated>2026-09-08T17:55:03.637956+00:00</updated><summary>Constrain a report format option to text or json with argparse choices.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/give-optional-cli-count-typed-default.html</id><title>Give an optional CLI count a typed default</title><link href="https://batulabnotes.netlify.app/articles/give-an-optional-cli-count-a-typed-default/" /><updated>2026-09-08T17:55:03.638166+00:00</updated><summary>Use type=int with an integer default for an optional count argument.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/make-two-cli-modes-mutually-exclusive.html</id><title>Make two CLI modes mutually exclusive</title><link href="https://batulabnotes.netlify.app/articles/make-two-cli-modes-mutually-exclusive/" /><updated>2026-09-08T17:55:03.638337+00:00</updated><summary>Require exactly one of two command-line modes with an argparse mutually exclusive group.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/parse-repeated-local-labels-with-append.html</id><title>Parse repeated local labels with append</title><link href="https://batulabnotes.netlify.app/articles/parse-repeated-local-labels-with-append/" /><updated>2026-09-08T17:55:03.638478+00:00</updated><summary>Collect repeated --label values in encounter order with argparse append.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-subcommand-to-select-dry-run-action.html</id><title>Use a subcommand to select a dry-run action</title><link href="https://batulabnotes.netlify.app/articles/use-a-subcommand-to-select-a-dry-run-action/" /><updated>2026-09-08T17:55:03.638652+00:00</updated><summary>Select a dry-run operation with an argparse subcommand and dispatch it through a callable stored in the parsed namespace.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/return-controlled-parser-error-for.html</id><title>Return a controlled parser error for an invalid mode</title><link href="https://batulabnotes.netlify.app/articles/return-a-controlled-parser-error-for-an-invalid-mode/" /><updated>2026-09-08T17:55:03.638991+00:00</updated><summary>Catch an argparse choice failure and return a stable application-level message for an unsupported mode.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/format-deterministic-logging-record.html</id><title>Format a deterministic logging record</title><link href="https://batulabnotes.netlify.app/articles/format-a-deterministic-logging-record/" /><updated>2026-09-08T17:55:03.639260+00:00</updated><summary>Use an explicit logging format with stable record fields to produce one predictable log line.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/keep-library-logging-quiet-with.html</id><title>Keep library logging quiet with a NullHandler</title><link href="https://batulabnotes.netlify.app/articles/keep-library-logging-quiet-with-a-nullhandler/" /><updated>2026-09-08T17:55:03.639418+00:00</updated><summary>Attach NullHandler to a library logger so an unconfigured application does not receive output from that handler.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/attach-named-logger-without-configuring.html</id><title>Attach a named logger without configuring the root logger</title><link href="https://batulabnotes.netlify.app/articles/attach-a-named-logger-without-configuring-the-root-logger/" /><updated>2026-09-08T17:55:03.639581+00:00</updated><summary>Send records from one named logger to its own handler while leaving root logger handlers unchanged.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/read-integer-option-from-ini-string.html</id><title>Read an integer option from an INI string</title><link href="https://batulabnotes.netlify.app/articles/read-an-integer-option-from-an-ini-string/" /><updated>2026-09-08T17:55:03.639761+00:00</updated><summary>Parse an INI string and retrieve a typed integer setting with ConfigParser.getint().</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/require-ini-section-before-reading.html</id><title>Require an INI section before reading settings</title><link href="https://batulabnotes.netlify.app/articles/require-an-ini-section-before-reading-settings/" /><updated>2026-09-08T17:55:03.639920+00:00</updated><summary>Check an INI section with has_section() before reading its settings.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-ini-interpolation-for-derived-local.html</id><title>Use INI interpolation for a derived local path</title><link href="https://batulabnotes.netlify.app/articles/use-ini-interpolation-for-a-derived-local-path/" /><updated>2026-09-08T17:55:03.640239+00:00</updated><summary>Use ConfigParser interpolation to derive a local path from another INI option.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/preserve-key-case-in-configparser.html</id><title>Preserve key case in a ConfigParser</title><link href="https://batulabnotes.netlify.app/articles/preserve-key-case-in-a-configparser/" /><updated>2026-09-08T17:55:03.640470+00:00</updated><summary>Configure ConfigParser.optionxform to retain option-name case.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/write-ini-configuration-to-stringio.html</id><title>Write an INI configuration to StringIO</title><link href="https://batulabnotes.netlify.app/articles/write-an-ini-configuration-to-stringio/" /><updated>2026-09-08T17:55:03.640679+00:00</updated><summary>Serialize an in-memory ConfigParser configuration to io.StringIO.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/load-named-standard-library-module-with.html</id><title>Load a named standard-library module with importlib</title><link href="https://batulabnotes.netlify.app/articles/load-a-named-standard-library-module-with-importlib/" /><updated>2026-09-08T17:55:03.640832+00:00</updated><summary>Dynamically import the standard-library statistics module and call a named function.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/reject-missing-module-spec-before-import.html</id><title>Reject a missing module spec before import</title><link href="https://batulabnotes.netlify.app/articles/reject-a-missing-module-spec-before-import/" /><updated>2026-09-08T17:55:03.640969+00:00</updated><summary>Use find_spec to recognize an unavailable module name and skip importing it.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/inspect-module-origin-using-findspec.html</id><title>Inspect a module origin using find_spec</title><link href="https://batulabnotes.netlify.app/articles/inspect-a-module-origin-using-find-spec/" /><updated>2026-09-08T17:55:03.641105+00:00</updated><summary>Find the sys module specification and inspect its built-in origin marker.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/reload-fixture-module-after-changing-it.html</id><title>Reload a fixture module after changing it</title><link href="https://batulabnotes.netlify.app/articles/reload-a-fixture-module-after-changing-it/" /><updated>2026-09-08T17:55:03.641270+00:00</updated><summary>Create an isolated fixture module, alter its source, and reload the existing module object.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/read-package-text-resource-with-files.html</id><title>Read a package text resource with files</title><link href="https://batulabnotes.netlify.app/articles/read-a-package-text-resource-with-files/" /><updated>2026-09-08T17:55:03.641505+00:00</updated><summary>Read UTF-8 text from a temporary package resource through importlib.resources.files.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/list-package-resource-names-without.html</id><title>List package resource names without assuming filesystem paths</title><link href="https://batulabnotes.netlify.app/articles/list-package-resource-names-without-assuming-filesystem-paths/" /><updated>2026-09-08T17:55:03.641696+00:00</updated><summary>Use importlib.resources Traversable objects to enumerate package resources without requiring filesystem paths.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-asfile-for-package-resource-path.html</id><title>Use as_file for a package resource path</title><link href="https://batulabnotes.netlify.app/articles/use-as-file-for-a-package-resource-path/" /><updated>2026-09-08T17:55:03.641899+00:00</updated><summary>Materialize a package resource as a temporary filesystem path only while an API needs one.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/parse-verbose-occurrences-into-logging.html</id><title>Parse --verbose occurrences into a logging level</title><link href="https://batulabnotes.netlify.app/articles/parse-verbose-occurrences-into-a-logging-level/" /><updated>2026-09-08T17:55:03.642117+00:00</updated><summary>Count -v or --verbose flags with argparse and apply an explicit logging-level policy.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-argparse-booleanoptionalaction-for.html</id><title>Use argparse BooleanOptionalAction for a local switch</title><link href="https://batulabnotes.netlify.app/articles/use-argparse-booleanoptionalaction-for-a-local-switch/" /><updated>2026-09-08T17:55:03.642389+00:00</updated><summary>Define paired --cache and --no-cache command-line switches with BooleanOptionalAction.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/read-fallback-value-from-default-in.html</id><title>Read a fallback value from DEFAULT in ConfigParser</title><link href="https://batulabnotes.netlify.app/articles/read-a-fallback-value-from-default-in-configparser/" /><updated>2026-09-08T17:55:03.642532+00:00</updated><summary>Let a section inherit an option from ConfigParser DEFAULT and distinguish it from the get() fallback argument.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/validate-whole-local-identifier-with.html</id><title>Validate a whole local identifier with fullmatch</title><link href="https://batulabnotes.netlify.app/articles/validate-whole-local-identifier-fullmatch/" /><updated>2026-09-08T17:55:03.642746+00:00</updated><summary>Use re.Pattern.fullmatch() to accept only complete ASCII-style local identifiers.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/extract-numbered-issue-references.html</id><title>Extract numbered issue references without matching prefixes</title><link href="https://batulabnotes.netlify.app/articles/extract-numbered-issue-references-without-prefixes/" /><updated>2026-09-08T17:55:03.642988+00:00</updated><summary>Find bare #number issue references while excluding references embedded in ASCII word-like prefixes.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/name-groups-in-build-label-regular.html</id><title>Name groups in a build-label regular expression</title><link href="https://batulabnotes.netlify.app/articles/name-groups-build-label-regular-expression/" /><updated>2026-09-08T17:55:03.643172+00:00</updated><summary>Parse a structured build label into explicitly named fields with Python regular expressions.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/replace-only-standalone-todo-markers.html</id><title>Replace only standalone TODO markers</title><link href="https://batulabnotes.netlify.app/articles/replace-only-standalone-todo-markers/" /><updated>2026-09-08T17:55:03.643359+00:00</updated><summary>Use word boundaries and re.Pattern.subn() to replace standalone TODO markers and count replacements.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/split-colon-delimited-local-setting-once.html</id><title>Split a colon-delimited local setting once</title><link href="https://batulabnotes.netlify.app/articles/split-colon-delimited-local-setting-once/" /><updated>2026-09-08T17:55:03.643573+00:00</updated><summary>Separate a setting key from a colon-containing value with str.split(separator, 1).</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-reescape-for-literal-search-token.html</id><title>Use re.escape for a literal search token</title><link href="https://batulabnotes.netlify.app/articles/use-re-escape-for-a-literal-search-token/" /><updated>2026-09-08T17:55:03.643736+00:00</updated><summary>Escape punctuation-bearing text before using it as a literal regular-expression search token.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/report-invalid-repeated-separator-with.html</id><title>Report an invalid repeated separator with finditer</title><link href="https://batulabnotes.netlify.app/articles/report-an-invalid-repeated-separator-with-finditer/" /><updated>2026-09-08T17:55:03.643896+00:00</updated><summary>Find repeated colon and semicolon runs and report their exact source positions.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/normalize-line-endings-before-text.html</id><title>Normalize line endings before a text comparison</title><link href="https://batulabnotes.netlify.app/articles/normalize-line-endings-before-a-text-comparison/" /><updated>2026-09-08T17:55:03.644271+00:00</updated><summary>Convert CRLF and CR line endings to LF before comparing text whose line-ending style is irrelevant.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/strip-utf-8-byte-order-mark-from-fixture.html</id><title>Strip a UTF-8 byte-order mark from a fixture</title><link href="https://batulabnotes.netlify.app/articles/strip-a-utf-8-byte-order-mark-from-a-fixture/" /><updated>2026-09-08T17:55:03.644472+00:00</updated><summary>Read a controlled UTF-8 fixture with utf-8-sig so an initial BOM does not become text.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/decode-html-character-references-safely.html</id><title>Decode HTML character references safely</title><link href="https://batulabnotes.netlify.app/articles/decode-html-character-references-safely/" /><updated>2026-09-08T17:55:03.644664+00:00</updated><summary>Convert named and numeric HTML character references to their Unicode characters with html.unescape.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/collect-text-from-selected-html-tags.html</id><title>Collect text from selected HTML tags with HTMLParser</title><link href="https://batulabnotes.netlify.app/articles/collect-text-from-selected-html-tags-with-htmlparser/" /><updated>2026-09-08T17:55:03.644873+00:00</updated><summary>Use a small HTMLParser subclass to collect text only from chosen tags.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/ignore-html-comments-while-collecting.html</id><title>Ignore HTML comments while collecting links</title><link href="https://batulabnotes.netlify.app/articles/ignore-html-comments-while-collecting-links/" /><updated>2026-09-08T17:55:03.645056+00:00</updated><summary>Collect real anchor targets with HTMLParser while comment contents remain non-links.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/read-html-attributes-without-regex.html</id><title>Read HTML attributes without regex matching</title><link href="https://batulabnotes.netlify.app/articles/read-html-attributes-without-regex-matching/" /><updated>2026-09-08T17:55:03.645400+00:00</updated><summary>Use HTMLParser attribute pairs instead of matching HTML source with regular expressions.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/parse-small-xml-settings-fixture.html</id><title>Parse a small XML settings fixture</title><link href="https://batulabnotes.netlify.app/articles/parse-small-xml-settings-fixture/" /><updated>2026-09-08T17:55:03.645605+00:00</updated><summary>Parse a fixed XML settings document with ElementTree and assert the extracted values.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/select-xml-children-with-namespace-map.html</id><title>Select XML children with a namespace map</title><link href="https://batulabnotes.netlify.app/articles/select-xml-children-with-a-namespace-map/" /><updated>2026-09-08T17:55:03.645903+00:00</updated><summary>Query namespaced XML children using ElementTree paths and a prefix-to-URI map.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/require-xml-attribute-before-converting.html</id><title>Require an XML attribute before converting it</title><link href="https://batulabnotes.netlify.app/articles/require-an-xml-attribute-before-converting-it/" /><updated>2026-09-08T17:55:03.646101+00:00</updated><summary>Validate a required XML attribute before converting it to an integer with ElementTree.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/serialize-xml-with-stable-attribute.html</id><title>Serialize XML with stable attribute insertion order</title><link href="https://batulabnotes.netlify.app/articles/serialize-xml-with-stable-attribute-insertion-order/" /><updated>2026-09-08T17:55:03.646269+00:00</updated><summary>Create attributes in an intentional order and serialize them predictably with ElementTree.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/stream-xml-records-with-iterparse.html</id><title>Stream XML records with iterparse</title><link href="https://batulabnotes.netlify.app/articles/stream-xml-records-with-iterparse/" /><updated>2026-09-08T17:55:03.646434+00:00</updated><summary>Process completed XML records incrementally with ElementTree.iterparse.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/distinguish-missing-xml-text-from-empty.html</id><title>Distinguish missing XML text from an empty string</title><link href="https://batulabnotes.netlify.app/articles/distinguish-missing-xml-text-from-an-empty-string/" /><updated>2026-09-08T17:55:03.646607+00:00</updated><summary>Classify absent elements, missing text, and explicitly assigned empty text with ElementTree.</summary></entry><entry><id>https://batulabnotes.blogspot.com/2026/09/use-elementtreefindall-for-direct-child.html</id><title>Use ElementTree.findall for direct child records</title><link href="https://batulabnotes.netlify.app/articles/use-elementtree-findall-for-direct-child-records/" /><updated>2026-09-08T17:55:03.646783+00:00</updated><summary>Select direct record children, excluding nested records, with ElementTree.findall.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/find-multiline-log-blocks-with-dotall/</id><title>Find multiline log blocks with DOTALL</title><link href="https://batulabnotes.netlify.app/articles/find-multiline-log-blocks-with-dotall/" /><updated>2026-09-08T17:55:03.647086+00:00</updated><summary>Extract bounded multiline log records with Python re.DOTALL.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-verbose-mode-for-a-documented-local-pattern/</id><title>Use VERBOSE mode for a documented local pattern</title><link href="https://batulabnotes.netlify.app/articles/use-verbose-mode-for-a-documented-local-pattern/" /><updated>2026-09-08T17:55:03.647232+00:00</updated><summary>Make a local identifier pattern easier to maintain with re.VERBOSE.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-lookahead-to-keep-overlapping-tokens/</id><title>Use a lookahead to keep overlapping tokens</title><link href="https://batulabnotes.netlify.app/articles/use-lookahead-to-keep-overlapping-tokens/" /><updated>2026-09-08T17:55:03.647437+00:00</updated><summary>Capture overlapping fixed-width tokens with a positive lookahead.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/count-substituted-values-with-subn/</id><title>Count substituted values with subn</title><link href="https://batulabnotes.netlify.app/articles/count-substituted-values-with-subn/" /><updated>2026-09-08T17:55:03.647598+00:00</updated><summary>Use re.subn to replace selected values and report the replacement count.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/catch-re-error-for-a-supplied-local-pattern/</id><title>Catch re.error for a supplied local pattern</title><link href="https://batulabnotes.netlify.app/articles/catch-re-error-for-a-supplied-local-pattern/" /><updated>2026-09-08T17:55:03.647822+00:00</updated><summary>Handle invalid locally supplied regular expressions during compilation.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/read-query-parameters-from-a-fixture-url/</id><title>Read query parameters from a fixture URL</title><link href="https://batulabnotes.netlify.app/articles/read-query-parameters-from-a-fixture-url/" /><updated>2026-09-08T17:55:03.648009+00:00</updated><summary>Parse a fixture URL and read decoded query values with urllib.parse.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/preserve-repeated-query-keys-with-parse-qsl/</id><title>Preserve repeated query keys with parse_qsl</title><link href="https://batulabnotes.netlify.app/articles/preserve-repeated-query-keys-with-parse-qsl/" /><updated>2026-09-08T17:55:03.648222+00:00</updated><summary>Keep repeated query keys and their order by parsing into pairs.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/encode-local-query-parameters-with-urlencode/</id><title>Encode local query parameters with urlencode</title><link href="https://batulabnotes.netlify.app/articles/encode-local-query-parameters-with-urlencode/" /><updated>2026-09-08T17:55:03.648389+00:00</updated><summary>Turn local parameter pairs into a correctly encoded query string.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/replace-a-url-query-without-string-concatenation/</id><title>Replace a URL query without string concatenation</title><link href="https://batulabnotes.netlify.app/articles/replace-a-url-query-without-string-concatenation/" /><updated>2026-09-08T17:55:03.648619+00:00</updated><summary>Replace only a URL query by splitting, updating, and reassembling components.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/join-a-relative-fixture-link-to-a-base-url/</id><title>Join a relative fixture link to a base URL</title><link href="https://batulabnotes.netlify.app/articles/join-a-relative-fixture-link-to-a-base-url/" /><updated>2026-09-08T17:55:03.648804+00:00</updated><summary>Resolve a relative fixture link against a base URL with urljoin.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/reject-a-url-fixture-with-an-unexpected-scheme/</id><title>Reject a URL fixture with an unexpected scheme</title><link href="https://batulabnotes.netlify.app/articles/reject-a-url-fixture-with-an-unexpected-scheme/" /><updated>2026-09-08T17:55:03.649052+00:00</updated><summary>Validate a fixture URL's parsed scheme against a small explicit allowlist.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/separate-a-fragment-from-a-local-documentation-url/</id><title>Separate a fragment from a local documentation URL</title><link href="https://batulabnotes.netlify.app/articles/separate-a-fragment-from-a-local-documentation-url/" /><updated>2026-09-08T17:55:03.649250+00:00</updated><summary>Use urldefrag to split a local documentation reference into a document URL and anchor.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/normalize-a-percent-encoded-query-value/</id><title>Normalize a percent-encoded query value</title><link href="https://batulabnotes.netlify.app/articles/normalize-a-percent-encoded-query-value/" /><updated>2026-09-08T17:55:03.649395+00:00</updated><summary>Decode one form-style query value and encode it again in a canonical percent-escaped form.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/parse-a-content-type-header-with-email-message/</id><title>Parse a Content-Type header with email.message</title><link href="https://batulabnotes.netlify.app/articles/parse-a-content-type-header-with-email-message/" /><updated>2026-09-08T17:55:03.649558+00:00</updated><summary>Parse a synthetic Content-Type header and read its normalized media type and parameters.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/read-a-repeated-response-header-from-a-local-message/</id><title>Read a repeated response header from a local message</title><link href="https://batulabnotes.netlify.app/articles/read-a-repeated-response-header-from-a-local-message/" /><updated>2026-09-08T17:55:03.649874+00:00</updated><summary>Use Message.get_all to retain every repeated Set-Cookie field in a synthetic header block.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/parse-a-synthetic-http-status-line/</id><title>Parse a synthetic HTTP status line</title><link href="https://batulabnotes.netlify.app/articles/parse-a-synthetic-http-status-line/" /><updated>2026-09-08T17:55:03.650064+00:00</updated><summary>Parse an isolated HTTP status line and validate its code with Python's HTTPStatus enum.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/decode-a-chunked-http-body-fixture/</id><title>Decode a chunked HTTP body fixture</title><link href="https://batulabnotes.netlify.app/articles/decode-a-chunked-http-body-fixture/" /><updated>2026-09-08T17:55:03.650269+00:00</updated><summary>Decode a controlled chunked-transfer byte fixture using explicit length and delimiter checks.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/reject-a-malformed-chunk-length/</id><title>Reject a malformed chunk length</title><link href="https://batulabnotes.netlify.app/articles/reject-a-malformed-chunk-length/" /><updated>2026-09-08T17:55:03.650591+00:00</updated><summary>Reject a non-hexadecimal chunk-size token before attempting to consume a chunk body.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/split-http-headers-from-a-byte-response-fixture/</id><title>Split HTTP headers from a byte response fixture</title><link href="https://batulabnotes.netlify.app/articles/split-http-headers-from-a-byte-response-fixture/" /><updated>2026-09-08T17:55:03.650797+00:00</updated><summary>Separate a byte response fixture into a start line, selected header values, and untouched body bytes.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/decode-a-response-body-using-a-declared-charset/</id><title>Decode a response body using a declared charset</title><link href="https://batulabnotes.netlify.app/articles/decode-a-response-body-using-a-declared-charset/" /><updated>2026-09-08T17:55:03.650982+00:00</updated><summary>Read a charset parameter from a Content-Type field and use it to decode response bytes.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/choose-a-fallback-charset-for-a-text-fixture/</id><title>Choose a fallback charset for a text fixture</title><link href="https://batulabnotes.netlify.app/articles/choose-a-fallback-charset-for-a-text-fixture/" /><updated>2026-09-08T17:55:03.651189+00:00</updated><summary>Use an explicit default encoding only when a byte fixture has no declared charset.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/interpret-a-204-response-as-having-no-body/</id><title>Interpret a 204 response as having no body</title><link href="https://batulabnotes.netlify.app/articles/interpret-a-204-response-as-having-no-body/" /><updated>2026-09-08T17:55:03.651352+00:00</updated><summary>Interpret a synthetic 204 response as an empty application-visible body while keeping trailing fixture bytes outside header parsing.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/keep-a-relative-redirect-target-unresolved/</id><title>Keep a relative redirect target unresolved</title><link href="https://batulabnotes.netlify.app/articles/keep-a-relative-redirect-target-unresolved/" /><updated>2026-09-08T17:55:03.651612+00:00</updated><summary>Parse a relative redirect target without inventing a base URL.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/read-a-location-header-from-a-local-response/</id><title>Read a Location header from a local response</title><link href="https://batulabnotes.netlify.app/articles/read-a-location-header-from-a-local-response/" /><updated>2026-09-08T17:55:03.651785+00:00</updated><summary>Extract a redirect Location value from fixed, local response-header bytes.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/avoid-treating-plus-signs-as-spaces-in-a-url-path/</id><title>Avoid treating plus signs as spaces in a URL path</title><link href="https://batulabnotes.netlify.app/articles/avoid-treating-plus-signs-as-spaces-in-a-url-path/" /><updated>2026-09-08T17:55:03.652112+00:00</updated><summary>Decode percent escapes in a URL path while preserving literal plus signs.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/enable-and-prove-a-foreign-key-constraint-in-memory/</id><title>Enable and prove a foreign-key constraint in memory</title><link href="https://batulabnotes.netlify.app/articles/enable-and-prove-a-foreign-key-constraint-in-memory/" /><updated>2026-09-08T17:55:03.652301+00:00</updated><summary>Enable SQLite foreign keys per connection and demonstrate rejection of a child row without a parent.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-a-check-constraint-for-a-bounded-score/</id><title>Use a CHECK constraint for a bounded score</title><link href="https://batulabnotes.netlify.app/articles/use-a-check-constraint-for-a-bounded-score/" /><updated>2026-09-08T17:55:03.652510+00:00</updated><summary>Keep integer scores within a declared 0–100 range and verify an out-of-range insert is rejected.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-a-unique-constraint-to-prevent-duplicate-local-keys/</id><title>Use a UNIQUE constraint to prevent duplicate local keys</title><link href="https://batulabnotes.netlify.app/articles/use-a-unique-constraint-to-prevent-duplicate-local-keys/" /><updated>2026-09-08T17:55:03.652708+00:00</updated><summary>Give a local configuration key a database-level uniqueness rule and test the duplicate path.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-a-composite-primary-key-for-a-mapping-table/</id><title>Use a composite primary key for a mapping table</title><link href="https://batulabnotes.netlify.app/articles/use-a-composite-primary-key-for-a-mapping-table/" /><updated>2026-09-08T17:55:03.652905+00:00</updated><summary>Model membership mappings whose identity is the pair of member and group identifiers.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/handle-a-not-null-failure-explicitly/</id><title>Handle a NOT NULL failure explicitly</title><link href="https://batulabnotes.netlify.app/articles/handle-a-not-null-failure-explicitly/" /><updated>2026-09-08T17:55:03.653114+00:00</updated><summary>Catch a missing required value as sqlite3.IntegrityError and preserve a clear application outcome.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-a-transaction-context-manager-for-two-inserts/</id><title>Use a transaction context manager for two inserts</title><link href="https://batulabnotes.netlify.app/articles/use-a-transaction-context-manager-for-two-inserts/" /><updated>2026-09-08T17:55:03.653437+00:00</updated><summary>Commit two related inserts with sqlite3.Connection used as a context manager.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/roll-back-a-transaction-after-a-constraint-failure/</id><title>Roll back a transaction after a constraint failure</title><link href="https://batulabnotes.netlify.app/articles/roll-back-a-transaction-after-a-constraint-failure/" /><updated>2026-09-08T17:55:03.653622+00:00</updated><summary>Handle a SQLite uniqueness violation and verify that the transaction's earlier insert was rolled back.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-savepoint-to-keep-an-earlier-in-memory-change/</id><title>Use SAVEPOINT to keep an earlier in-memory change</title><link href="https://batulabnotes.netlify.app/articles/use-savepoint-to-keep-an-earlier-in-memory-change/" /><updated>2026-09-08T17:55:03.653980+00:00</updated><summary>Undo a later SQLite insert while retaining an earlier insert in one in-memory transaction.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-parameter-binding-for-a-quoted-search-value/</id><title>Use parameter binding for a quoted search value</title><link href="https://batulabnotes.netlify.app/articles/use-parameter-binding-for-a-quoted-search-value/" /><updated>2026-09-08T17:55:03.654196+00:00</updated><summary>Search SQLite text containing an apostrophe by binding the value to a qmark placeholder.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/count-rows-correctly-with-count-star/</id><title>Count rows correctly with COUNT star</title><link href="https://batulabnotes.netlify.app/articles/count-rows-correctly-with-count-star/" /><updated>2026-09-08T17:55:03.654395+00:00</updated><summary>Use SQLite COUNT(*) when the requirement is to count every row, including rows with NULL values.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/keep-null-separate-from-an-empty-string-in-a-query/</id><title>Keep NULL separate from an empty string in a query</title><link href="https://batulabnotes.netlify.app/articles/keep-null-separate-from-an-empty-string-in-a-query/" /><updated>2026-09-08T17:55:03.654564+00:00</updated><summary>Query missing text and deliberately blank text with separate SQLite predicates.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-coalesce-for-display-fallbacks/</id><title>Use COALESCE for display fallbacks</title><link href="https://batulabnotes.netlify.app/articles/use-coalesce-for-display-fallbacks/" /><updated>2026-09-08T17:55:03.654824+00:00</updated><summary>Render a readable fallback for NULL without changing the stored value.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/find-unmatched-rows-with-a-left-join/</id><title>Find unmatched rows with a LEFT JOIN</title><link href="https://batulabnotes.netlify.app/articles/find-unmatched-rows-with-a-left-join/" /><updated>2026-09-08T17:55:03.655243+00:00</updated><summary>Use a LEFT JOIN and a NULL test to identify parent rows with no related rows.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/avoid-a-join-multiplication-error-by-aggregating-first/</id><title>Avoid a join multiplication error by aggregating first</title><link href="https://batulabnotes.netlify.app/articles/avoid-a-join-multiplication-error-by-aggregating-first/" /><updated>2026-09-08T17:55:03.655434+00:00</updated><summary>Aggregate independent one-to-many tables before joining their per-parent totals.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-exists-to-test-related-row-presence/</id><title>Use EXISTS to test related-row presence</title><link href="https://batulabnotes.netlify.app/articles/use-exists-to-test-related-row-presence/" /><updated>2026-09-08T17:55:03.655584+00:00</updated><summary>Return a per-row presence flag with a correlated EXISTS subquery.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-a-correlated-subquery-for-a-per-group-maximum/</id><title>Use a correlated subquery for a per-group maximum</title><link href="https://batulabnotes.netlify.app/articles/use-a-correlated-subquery-for-a-per-group-maximum/" /><updated>2026-09-08T17:55:03.655881+00:00</updated><summary>Return every score tied for the highest value within its team using SQLite from Python.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-having-after-grouping-local-records/</id><title>Use HAVING after grouping local records</title><link href="https://batulabnotes.netlify.app/articles/use-having-after-grouping-local-records/" /><updated>2026-09-08T17:55:03.656205+00:00</updated><summary>Filter grouped SQLite totals with HAVING after summing local time-entry rows.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/order-deterministic-query-output-with-a-tie-breaker/</id><title>Order deterministic query output with a tie breaker</title><link href="https://batulabnotes.netlify.app/articles/order-deterministic-query-output-with-a-tie-breaker/" /><updated>2026-09-08T17:55:03.656471+00:00</updated><summary>Add a unique secondary sort key so tied SQLite priorities have a defined output order.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-a-window-row-number-for-ranked-fixture-rows/</id><title>Use a window row number for ranked fixture rows</title><link href="https://batulabnotes.netlify.app/articles/use-a-window-row-number-for-ranked-fixture-rows/" /><updated>2026-09-08T17:55:03.656686+00:00</updated><summary>Assign sequential per-division fixture positions with SQLite ROW_NUMBER().</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-a-cte-to-name-a-filtered-local-set/</id><title>Use a CTE to name a filtered local set</title><link href="https://batulabnotes.netlify.app/articles/use-a-cte-to-name-a-filtered-local-set/" /><updated>2026-09-08T17:55:03.657018+00:00</updated><summary>Name filtered in-memory SQLite event rows with a common table expression before aggregation.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-insert-or-ignore-and-inspect-rowcount/</id><title>Use INSERT OR IGNORE and inspect rowcount</title><link href="https://batulabnotes.netlify.app/articles/use-insert-or-ignore-and-inspect-rowcount/" /><updated>2026-09-08T17:55:03.657245+00:00</updated><summary>Detect whether a unique-key insert added a row without raising on a duplicate.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-an-upsert-that-updates-one-column/</id><title>Use an UPSERT that updates one column</title><link href="https://batulabnotes.netlify.app/articles/use-an-upsert-that-updates-one-column/" /><updated>2026-09-08T17:55:03.657466+00:00</updated><summary>Update only a chosen column when an insert conflicts with an existing primary key.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/check-changes-after-a-deliberate-update/</id><title>Check changes after a deliberate update</title><link href="https://batulabnotes.netlify.app/articles/check-changes-after-a-deliberate-update/" /><updated>2026-09-08T17:55:03.657628+00:00</updated><summary>Confirm the count reported by SQLite after an update chosen to affect one row.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/set-row-factory-to-sqlite3-row-for-named-columns/</id><title>Set row_factory to sqlite3.Row for named columns</title><link href="https://batulabnotes.netlify.app/articles/set-row-factory-to-sqlite3-row-for-named-columns/" /><updated>2026-09-08T17:55:03.657789+00:00</updated><summary>Fetch SQLite rows that support both named and positional column access.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-executemany-inside-one-transaction/</id><title>Use executemany inside one transaction</title><link href="https://batulabnotes.netlify.app/articles/use-executemany-inside-one-transaction/" /><updated>2026-09-08T17:55:03.657925+00:00</updated><summary>Insert a small parameter sequence with executemany under one transaction.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/store-and-retrieve-a-blob-fixture/</id><title>Store and retrieve a BLOB fixture</title><link href="https://batulabnotes.netlify.app/articles/store-and-retrieve-a-blob-fixture/" /><updated>2026-09-08T17:55:03.658098+00:00</updated><summary>Store deterministic binary fixture bytes in an in-memory SQLite BLOB column and retrieve them unchanged.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/register-adapter-free-named-parameter-query/</id><title>Register an adapter-free named parameter query</title><link href="https://batulabnotes.netlify.app/articles/register-adapter-free-named-parameter-query/" /><updated>2026-09-08T17:55:03.658606+00:00</updated><summary>Use SQLite named placeholders with native Python values, without registering a custom adapter.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-explain-query-plan-for-an-indexed-lookup/</id><title>Use EXPLAIN QUERY PLAN for an indexed lookup</title><link href="https://batulabnotes.netlify.app/articles/use-explain-query-plan-for-an-indexed-lookup/" /><updated>2026-09-08T17:55:03.658783+00:00</updated><summary>Check that an in-memory SQLite lookup plan mentions a deliberately created index.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/create-a-partial-index-for-active-rows/</id><title>Create a partial index for active rows</title><link href="https://batulabnotes.netlify.app/articles/create-a-partial-index-for-active-rows/" /><updated>2026-09-08T17:55:03.658940+00:00</updated><summary>Create an SQLite partial index that contains entries only for rows whose active flag is 1.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-a-deferred-foreign-key-within-one-transaction/</id><title>Use a deferred foreign key within one transaction</title><link href="https://batulabnotes.netlify.app/articles/use-a-deferred-foreign-key-within-one-transaction/" /><updated>2026-09-08T17:55:03.659120+00:00</updated><summary>Insert a child before its parent, resolve the relationship, and commit one SQLite transaction.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/why-does-a-unittest-fixture-retain-data-between-tests/</id><title>Why does a unittest fixture retain data between tests?</title><link href="https://batulabnotes.netlify.app/articles/why-does-a-unittest-fixture-retain-data-between-tests/" /><updated>2026-09-08T17:55:03.659310+00:00</updated><summary>Reproduce class-level list leakage and recreate the mutable object in setUp.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/run-unittest-cleanup-even-when-setup-raises/</id><title>Run unittest cleanup even when setUp raises</title><link href="https://batulabnotes.netlify.app/articles/run-unittest-cleanup-even-when-setup-raises/" /><updated>2026-09-08T17:55:03.659485+00:00</updated><summary>Use addCleanup to release acquired state on the fixture setup-failure path.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/why-is-a-contextmanager-generator-required-to-yield-exactly-once/</id><title>Why is a contextmanager generator required to yield exactly once?</title><link href="https://batulabnotes.netlify.app/articles/why-is-a-contextmanager-generator-required-to-yield-exactly-once/" /><updated>2026-09-08T17:55:03.659685+00:00</updated><summary>Compare zero-yield, single-yield, and two-yield generator context-manager lifecycles.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/collect-all-table-driven-failures-with-unittest-subtest/</id><title>Collect all table-driven failures with unittest subTest</title><link href="https://batulabnotes.netlify.app/articles/collect-all-table-driven-failures-with-unittest-subtest/" /><updated>2026-09-08T17:55:03.659997+00:00</updated><summary>Contrast a stopping loop with subTest failure events for boundary inputs.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/compare-unordered-lists-that-contain-dictionaries-in-unittest/</id><title>Compare unordered lists that contain dictionaries in unittest</title><link href="https://batulabnotes.netlify.app/articles/compare-unordered-lists-that-contain-dictionaries-in-unittest/" /><updated>2026-09-08T17:55:03.660162+00:00</updated><summary>Use assertCountEqual for order-insensitive comparisons of mappings while retaining duplicate counts.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/stop-assertalmostequal-from-accepting-the-wrong-numeric-tolerance/</id><title>Stop assertAlmostEqual from accepting the wrong numeric tolerance</title><link href="https://batulabnotes.netlify.app/articles/stop-assertalmostequal-from-accepting-the-wrong-numeric-tolerance/" /><updated>2026-09-08T17:55:03.660305+00:00</updated><summary>Contrast decimal-place comparison with an explicit absolute error boundary.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/treat-assertraisesregex-patterns-as-regular-expressions/</id><title>Treat assertRaisesRegex patterns as regular expressions</title><link href="https://batulabnotes.netlify.app/articles/treat-assertraisesregex-patterns-as-regular-expressions/" /><updated>2026-09-08T17:55:03.660462+00:00</updated><summary>Show why literal punctuation must be escaped and when strict anchors are needed.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/test-a-warning-without-hiding-unrelated-warning-categories/</id><title>Test a warning without hiding unrelated warning categories</title><link href="https://batulabnotes.netlify.app/articles/test-a-warning-without-hiding-unrelated-warning-categories/" /><updated>2026-09-08T17:55:03.660603+00:00</updated><summary>Capture the expected warning while retaining evidence for another category.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/keep-long-unittest-diffs-available-when-debugging-a-mismatch/</id><title>Keep long unittest diffs available when debugging a mismatch</title><link href="https://batulabnotes.netlify.app/articles/keep-long-unittest-diffs-available-when-debugging-a-mismatch/" /><updated>2026-09-08T17:55:03.660740+00:00</updated><summary>Compare bounded and unlimited unittest diagnostic output without snapshotting it.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/restore-a-patched-mapping-after-an-exception-with-patch-dict/</id><title>Restore a patched mapping after an exception with patch.dict</title><link href="https://batulabnotes.netlify.app/articles/restore-a-patched-mapping-after-an-exception-with-patch-dict/" /><updated>2026-09-08T17:55:03.660952+00:00</updated><summary>Prove that patch.dict restores an in-memory mapping after exceptional exit.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/patch-lookup-namespace-imported-directly/</id><title>Patch the lookup namespace when a dependency was imported directly</title><link href="https://batulabnotes.netlify.app/articles/patch-lookup-namespace-imported-directly/" /><updated>2026-09-08T17:55:03.661100+00:00</updated><summary>A synthetic reproduction of a provider patch that installs successfully but misses a consumer's already-bound dependency.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/catch-outdated-call-signature-create-autospec/</id><title>Catch an outdated call signature with create_autospec</title><link href="https://batulabnotes.netlify.app/articles/catch-outdated-call-signature-create-autospec/" /><updated>2026-09-08T17:55:03.661264+00:00</updated><summary>Contrast a loose Mock with create_autospec to expose a misspelled keyword before an integration test.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-spec-set-reject-accidental-mock-attributes/</id><title>Use spec_set to reject accidental mock attributes</title><link href="https://batulabnotes.netlify.app/articles/use-spec-set-reject-accidental-mock-attributes/" /><updated>2026-09-08T17:55:03.661531+00:00</updated><summary>Show the difference between spec's restricted reads and spec_set's restricted reads and writes.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/why-mock-side-effect-stops-stopiteration/</id><title>Why does Mock side_effect stop with StopIteration?</title><link href="https://batulabnotes.netlify.app/articles/why-mock-side-effect-stops-stopiteration/" /><updated>2026-09-08T17:55:03.661689+00:00</updated><summary>Demonstrate iterable side_effect exhaustion and contrast it with an intentional callable fallback.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/reset-mock-call-history-without-changing-behavior/</id><title>Reset mock call history without silently changing behavior</title><link href="https://batulabnotes.netlify.app/articles/reset-mock-call-history-without-changing-behavior/" /><updated>2026-09-08T17:55:03.661827+00:00</updated><summary>Separate a Mock's recorded interactions from its configured return and side-effect behavior during reset_mock().</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/distinguish-mocked-async-call-awaited-call/</id><title>Distinguish a mocked async call from an awaited call</title><link href="https://batulabnotes.netlify.app/articles/distinguish-mocked-async-call-awaited-call/" /><updated>2026-09-08T17:55:03.662232+00:00</updated><summary>Use AsyncMock call and await counters to prove that a coroutine was consumed.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/verify-mock-call-sequence-extra-calls/</id><title>Verify a mock call sequence without forbidding extra calls accidentally</title><link href="https://batulabnotes.netlify.app/articles/verify-mock-call-sequence-extra-calls/" /><updated>2026-09-08T17:55:03.662560+00:00</updated><summary>Contrast sequence inclusion with equality against a complete mock interaction history.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/test-suppress-exception-boundary/</id><title>Test which exception a suppress block actually handles</title><link href="https://batulabnotes.netlify.app/articles/test-suppress-exception-boundary/" /><updated>2026-09-08T17:55:03.662740+00:00</updated><summary>Demonstrate that suppress(KeyError) handles missing keys but lets ValueError propagate.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-exitstack-partial-resource-acquisition/</id><title>Use ExitStack to unwind partially acquired resources</title><link href="https://batulabnotes.netlify.app/articles/use-exitstack-partial-resource-acquisition/" /><updated>2026-09-08T17:55:03.662901+00:00</updated><summary>Verify LIFO cleanup after a synthetic third-resource acquisition failure.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/transfer-cleanup-ownership-exitstack-pop-all/</id><title>Transfer cleanup ownership with ExitStack.pop_all</title><link href="https://batulabnotes.netlify.app/articles/transfer-cleanup-ownership-exitstack-pop-all/" /><updated>2026-09-08T17:55:03.663065+00:00</updated><summary>Transfer registered callbacks to a new stack and verify deferred LIFO cleanup.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/avoid-suppressing-an-exception-accidentally-inside-a-contextmanager/</id><title>Avoid suppressing an exception accidentally inside a contextmanager</title><link href="https://batulabnotes.netlify.app/articles/avoid-suppressing-an-exception-accidentally-inside-a-contextmanager/" /><updated>2026-09-08T17:55:03.663244+00:00</updated><summary>Compare a logging-only generator context manager with one that logs and re-raises the same sentinel exception.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/keep-a-caller-owned-stream-open-with-nullcontext/</id><title>Keep a caller-owned stream open with nullcontext</title><link href="https://batulabnotes.netlify.app/articles/keep-a-caller-owned-stream-open-with-nullcontext/" /><updated>2026-09-08T17:55:03.663399+00:00</updated><summary>Use nullcontext for a supplied StringIO while a helper-created StringIO remains owned and closes on exit.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/prevent-redirect-stdout-from-swallowing-a-diagnostic-after-an-exception/</id><title>Prevent redirect_stdout from swallowing a diagnostic after an exception</title><link href="https://batulabnotes.netlify.app/articles/prevent-redirect-stdout-from-swallowing-a-diagnostic-after-an-exception/" /><updated>2026-09-08T17:55:03.663597+00:00</updated><summary>Raise inside redirect_stdout, catch outside, and verify stdout identity restoration plus captured output.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/sort-a-list-in-a-test-without-mutating-the-expected-fixture/</id><title>Sort a list in a test without mutating the expected fixture</title><link href="https://batulabnotes.netlify.app/articles/sort-a-list-in-a-test-without-mutating-the-expected-fixture/" /><updated>2026-09-08T17:55:03.663932+00:00</updated><summary>Expose an aliased, mutated oracle and contrast it with snapshots that detect in-place sorting.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/detect-when-shallow-copies-fail-to-isolate-nested-test-data/</id><title>Detect when shallow copies fail to isolate nested test data</title><link href="https://batulabnotes.netlify.app/articles/detect-when-shallow-copies-fail-to-isolate-nested-test-data/" /><updated>2026-09-08T17:55:03.664133+00:00</updated><summary>Show the nested-list alias left by dict.copy and contrast it with deepcopy isolation.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/avoid-shared-iterator-exhaustion-across-repeated-tests/</id><title>Avoid shared iterator exhaustion across repeated tests</title><link href="https://batulabnotes.netlify.app/articles/avoid-shared-iterator-exhaustion-across-repeated-tests/" /><updated>2026-09-08T17:55:03.664289+00:00</updated><summary>Separate reusable source data from a single-pass iterator by testing the two observed consumption sequences.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-assertlogs-without-depending-on-timestamps-or-handler-formatting/</id><title>Use assertLogs without depending on timestamps or handler formatting</title><link href="https://batulabnotes.netlify.app/articles/use-assertlogs-without-depending-on-timestamps-or-handler-formatting/" /><updated>2026-09-08T17:55:03.664564+00:00</updated><summary>Use assertLogs LogRecord fields to test a logging event without snapshotting timestamp-bearing rendered lines.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/test-generator-failures-at-iteration-time-instead-of-construction/</id><title>Test generator failures at iteration time instead of construction</title><link href="https://batulabnotes.netlify.app/articles/test-generator-failures-at-iteration-time-instead-of-construction/" /><updated>2026-09-08T17:55:03.664826+00:00</updated><summary>Place next() inside assertRaises to test when a generator body actually raises.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/keep-custom-equality-assertions-from-hiding-object-identity-bugs/</id><title>Keep custom equality assertions from hiding object identity bugs</title><link href="https://batulabnotes.netlify.app/articles/keep-custom-equality-assertions-from-hiding-object-identity-bugs/" /><updated>2026-09-08T17:55:03.665109+00:00</updated><summary>Contrast value equality with identity assertions when an API must return a particular object.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/report-unexpected-success-in-an-expectedfailure-unittest/</id><title>Report unexpected success in an expectedFailure unittest</title><link href="https://batulabnotes.netlify.app/articles/report-unexpected-success-in-an-expectedfailure-unittest/" /><updated>2026-09-08T17:55:03.665544+00:00</updated><summary>Run controlled expected-failure cases and inspect why a stale marker leaves the result unsuccessful.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/reject-non-alphabet-characters-strict-base64-decoding/</id><title>Reject non-alphabet characters during strict Base64 decoding</title><link href="https://batulabnotes.netlify.app/articles/reject-non-alphabet-characters-strict-base64-decoding/" /><updated>2026-09-08T17:55:03.665736+00:00</updated><summary>Compare permissive and strict Base64 decoding when punctuation appears in encoded input.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/capture-printed-diagnostics-with-redirect-stderr/</id><title>Capture printed diagnostics with redirect_stderr</title><link href="https://batulabnotes.netlify.app/articles/capture-printed-diagnostics-with-redirect-stderr/" /><updated>2026-09-08T17:55:03.665911+00:00</updated><summary>Capture a validator's stderr diagnostic while confirming it produced no stdout.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/diagnose-odd-length-hexadecimal-before-unhexlify/</id><title>Diagnose an odd-length hexadecimal field before unhexlify</title><link href="https://batulabnotes.netlify.app/articles/diagnose-odd-length-hexadecimal-before-unhexlify/" /><updated>2026-09-08T17:55:03.666078+00:00</updated><summary>Separate an odd hexadecimal digit count from non-hexadecimal input before conversion.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/decode-utf8-character-split-across-byte-chunks-incrementally/</id><title>Decode a UTF-8 character split across byte chunks incrementally</title><link href="https://batulabnotes.netlify.app/articles/decode-utf8-character-split-across-byte-chunks-incrementally/" /><updated>2026-09-08T17:55:03.666269+00:00</updated><summary>Use an incremental UTF-8 decoder to retain incomplete trailing bytes between chunks.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-closing-for-an-iterator-with-a-close-method/</id><title>Use closing for an iterator with a close method</title><link href="https://batulabnotes.netlify.app/articles/use-closing-for-an-iterator-with-a-close-method/" /><updated>2026-09-08T17:55:03.666457+00:00</updated><summary>Ensure an iterator's close method runs when an early loop exit leaves its block.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/separate-bisect-insertion-position-from-exact-membership/</id><title>Separate bisect insertion position from exact membership</title><link href="https://batulabnotes.netlify.app/articles/separate-bisect-insertion-position-from-exact-membership/" /><updated>2026-09-08T17:55:03.666626+00:00</updated><summary>Use bisect_left with a bounds-and-equality check to distinguish insertion positions from exact matches.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-a-heap-counter-to-avoid-comparing-dictionary-payloads-on-ties/</id><title>Use a heap counter to avoid comparing dictionary payloads on ties</title><link href="https://batulabnotes.netlify.app/articles/use-a-heap-counter-to-avoid-comparing-dictionary-payloads-on-ties/" /><updated>2026-09-08T17:55:03.666859+00:00</updated><summary>Add a monotonic counter to heap entries so tied priorities do not compare opaque dictionary payloads.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-contextmanager-to-time-a-pure-in-memory-block/</id><title>Use contextmanager to time a pure in-memory block</title><link href="https://batulabnotes.netlify.app/articles/use-contextmanager-to-time-a-pure-in-memory-block/" /><updated>2026-09-08T17:55:03.667056+00:00</updated><summary>Put timing cleanup in a contextmanager finally block so it runs when the block raises.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/explain-why-contextdecorator-can-hide-shared-state/</id><title>Explain why ContextDecorator can hide shared state</title><link href="https://batulabnotes.netlify.app/articles/explain-why-contextdecorator-can-hide-shared-state/" /><updated>2026-09-08T17:55:03.667327+00:00</updated><summary>Use a decorator factory to give each ContextDecorator-managed call independent mutable state.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/return-a-sentinel-instead-of-catching-every-exception/</id><title>Return a sentinel instead of catching every Exception</title><link href="https://batulabnotes.netlify.app/articles/return-a-sentinel-instead-of-catching-every-exception/" /><updated>2026-09-08T17:55:03.667518+00:00</updated><summary>Use an identity-checked sentinel to distinguish absent dictionary keys from values such as None.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/preserve-original-exception-raise-from/</id><title>Preserve the original exception with raise from</title><link href="https://batulabnotes.netlify.app/articles/preserve-original-exception-raise-from/" /><updated>2026-09-08T17:55:03.667830+00:00</updated><summary>Wrap an invalid configuration value while retaining its ValueError as the explicit cause.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/format-short-exception-only-diagnostic/</id><title>Format a short exception-only diagnostic</title><link href="https://batulabnotes.netlify.app/articles/format-short-exception-only-diagnostic/" /><updated>2026-09-08T17:55:03.667994+00:00</updated><summary>Use traceback.format_exception_only to render a controlled ValueError message without traceback frames.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/extract-exception-type-without-traceback-paths/</id><title>Extract an exception type without exposing traceback paths</title><link href="https://batulabnotes.netlify.app/articles/extract-exception-type-without-traceback-paths/" /><updated>2026-09-08T17:55:03.668167+00:00</updated><summary>Use a type-only status field when a caught KeyError's message and formatted traceback are not reportable.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/exceptiongroup-except-star-independent-validation/</id><title>Use ExceptionGroup except star for independent validation failures</title><link href="https://batulabnotes.netlify.app/articles/exceptiongroup-except-star-independent-validation/" /><updated>2026-09-08T17:55:03.668320+00:00</updated><summary>Collect independent validation errors and selectively handle their ValueError and TypeError members.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/distinguish-keyerror-missing-optional-value/</id><title>Distinguish KeyError from a missing optional value</title><link href="https://batulabnotes.netlify.app/articles/distinguish-keyerror-missing-optional-value/" /><updated>2026-09-08T17:55:03.668476+00:00</updated><summary>Preserve a present optional null while rejecting an absent required nested key at a configuration boundary.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/reject-bool-where-integer-option-required/</id><title>Reject a bool where an integer option is required</title><link href="https://batulabnotes.netlify.app/articles/reject-bool-where-integer-option-required/" /><updated>2026-09-08T17:55:03.668687+00:00</updated><summary>Use type(value) is int when an option must accept only exact integers, not bool or float lookalikes.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/turn-parser-failure-into-structured-result-object/</id><title>Turn a parser failure into a structured result object</title><link href="https://batulabnotes.netlify.app/articles/turn-parser-failure-into-structured-result-object/" /><updated>2026-09-08T17:55:03.668947+00:00</updated><summary>Convert an integer parsing ValueError into an explicit success-or-error result rather than returning ambiguous None.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/avoid-mutable-error-details-reusable-exception/</id><title>Avoid mutable error details in a reusable exception</title><link href="https://batulabnotes.netlify.app/articles/avoid-mutable-error-details-reusable-exception/" /><updated>2026-09-08T17:55:03.669099+00:00</updated><summary>Copy caller-provided validation details when constructing an exception so later dict mutation cannot rewrite the reported error.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-custom-exception-invalid-state-transition/</id><title>Use a custom exception for an invalid state transition</title><link href="https://batulabnotes.netlify.app/articles/use-custom-exception-invalid-state-transition/" /><updated>2026-09-08T17:55:03.669243+00:00</updated><summary>Raise an InvalidTransition exception with from_state and to_state attributes when a workflow transition is not allowed.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/attach-stable-error-code-validation-error/</id><title>Attach a stable error code to a validation error</title><link href="https://batulabnotes.netlify.app/articles/attach-stable-error-code-validation-error/" /><updated>2026-09-08T17:55:03.669388+00:00</updated><summary>Put stable machine-readable codes on validation exceptions so consumers branch on codes instead of human messages.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/keep-finally-cleanup-from-masking-main-error/</id><title>Keep finally cleanup from masking the main error</title><link href="https://batulabnotes.netlify.app/articles/keep-finally-cleanup-from-masking-main-error/" /><updated>2026-09-08T17:55:03.669604+00:00</updated><summary>Preserve a ValueError when a cleanup action also fails in a finally clause.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-try-else-to-separate-successful-parsing-from-recovery/</id><title>Use try else to separate successful parsing from recovery</title><link href="https://batulabnotes.netlify.app/articles/use-try-else-to-separate-successful-parsing-from-recovery/" /><updated>2026-09-08T17:55:03.669807+00:00</updated><summary>Keep JSON parsing recovery separate from work that happens after a successful parse.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/recognize-an-unhandled-baseexception-boundary/</id><title>Recognize an unhandled BaseException boundary</title><link href="https://batulabnotes.netlify.app/articles/recognize-an-unhandled-baseexception-boundary/" /><updated>2026-09-08T17:55:03.670005+00:00</updated><summary>Allow KeyboardInterrupt to pass through an ordinary application-error boundary.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/report-index-of-rejected-sequence-item/</id><title>Report the index of a rejected sequence item</title><link href="https://batulabnotes.netlify.app/articles/report-index-of-rejected-sequence-item/" /><updated>2026-09-08T17:55:03.670180+00:00</updated><summary>Use enumerate to report both the location and value of the first rejected item.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/validate-all-items-and-raise-an-exceptiongroup/</id><title>Validate all items and raise an ExceptionGroup</title><link href="https://batulabnotes.netlify.app/articles/validate-all-items-and-raise-an-exceptiongroup/" /><updated>2026-09-08T17:55:03.670574+00:00</updated><summary>Collect negative-value and non-integer validation failures in one ExceptionGroup.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-a-context-manager-to-restore-a-module-level-setting/</id><title>Use a context manager to restore a module-level setting</title><link href="https://batulabnotes.netlify.app/articles/use-a-context-manager-to-restore-a-module-level-setting/" /><updated>2026-09-08T17:55:03.670770+00:00</updated><summary>Restore a temporary module-level setting with a context manager, even when the body raises an exception.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/handle-stopiteration-at-an-iterator-consumer-boundary/</id><title>Handle StopIteration at an iterator consumer boundary</title><link href="https://batulabnotes.netlify.app/articles/handle-stopiteration-at-an-iterator-consumer-boundary/" /><updated>2026-09-08T17:55:03.671001+00:00</updated><summary>Consume an iterator safely with a sentinel so exhaustion is distinct from a stored None value.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/avoid-catching-generatorexit-in-library-code/</id><title>Avoid catching GeneratorExit in library code</title><link href="https://batulabnotes.netlify.app/articles/avoid-catching-generatorexit-in-library-code/" /><updated>2026-09-08T17:55:03.671258+00:00</updated><summary>Let GeneratorExit propagate through generator cleanup instead of swallowing BaseException.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/make-a-retry-decision-from-explicit-exception-classes/</id><title>Make a retry decision from explicit exception classes</title><link href="https://batulabnotes.netlify.app/articles/make-a-retry-decision-from-explicit-exception-classes/" /><updated>2026-09-08T17:55:03.671448+00:00</updated><summary>Choose retries by exception type so a similar error message cannot retry a permanent failure.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/disable-sequencematcher-autojunk-for-a-repeated-short-alphabet/</id><title>Disable SequenceMatcher autojunk for a repeated short alphabet</title><link href="https://batulabnotes.netlify.app/articles/disable-sequencematcher-autojunk-for-a-repeated-short-alphabet/" /><updated>2026-09-08T17:55:03.671639+00:00</updated><summary>Compare SequenceMatcher matching blocks with autojunk enabled and disabled on repetitive A/B data.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/reject-duplicate-json-object-names-object-pairs-hook/</id><title>Reject duplicate JSON object names with object_pairs_hook</title><link href="https://batulabnotes.netlify.app/articles/reject-duplicate-json-object-names-object-pairs-hook/" /><updated>2026-09-08T17:55:03.671844+00:00</updated><summary>Reject repeated JSON object names before dictionary conversion silently discards an earlier value.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/decode-json-number-as-decimal-amount/</id><title>Decode a JSON number as Decimal for an amount field</title><link href="https://batulabnotes.netlify.app/articles/decode-json-number-as-decimal-amount/" /><updated>2026-09-08T17:55:03.672028+00:00</updated><summary>Use parse_float=Decimal to preserve a decimal JSON amount through arithmetic.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/reject-nan-local-json-fixture/</id><title>Reject NaN in a local JSON fixture</title><link href="https://batulabnotes.netlify.app/articles/reject-nan-local-json-fixture/" /><updated>2026-09-08T17:55:03.672229+00:00</updated><summary>Use parse_constant to reject the non-standard NaN token accepted by Python's default JSON decoder.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/detect-json-key-collisions-unicode-normalization/</id><title>Detect JSON key collisions after Unicode normalization</title><link href="https://batulabnotes.netlify.app/articles/detect-json-key-collisions-unicode-normalization/" /><updated>2026-09-08T17:55:03.672488+00:00</updated><summary>Normalize JSON object names to NFC inside object_pairs_hook and reject policy-level collisions with both original spellings.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/json-encoder-default-one-tagged-value-type/</id><title>Use a JSON encoder default only for one tagged value type</title><link href="https://batulabnotes.netlify.app/articles/json-encoder-default-one-tagged-value-type/" /><updated>2026-09-08T17:55:03.672744+00:00</updated><summary>Encode UUID values as tagged objects while continuing to reject unsupported sets.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/differentiate-json-null-from-omitted-mapping-key/</id><title>Differentiate a JSON null from an omitted mapping key</title><link href="https://batulabnotes.netlify.app/articles/differentiate-json-null-from-omitted-mapping-key/" /><updated>2026-09-08T17:55:03.672949+00:00</updated><summary>Preserve omission and explicit JSON null as separate update instructions after decoding.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/limit-json-fixture-before-decoding-stringio/</id><title>Limit a JSON fixture before decoding from StringIO</title><link href="https://batulabnotes.netlify.app/articles/limit-json-fixture-before-decoding-stringio/" /><updated>2026-09-08T17:55:03.673188+00:00</updated><summary>Enforce a character limit with read(limit + 1) before decoding a StringIO JSON fixture.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/report-jsondecodeerror-line-column-without-source/</id><title>Report a JSONDecodeError line and column without printing the source</title><link href="https://batulabnotes.netlify.app/articles/report-jsondecodeerror-line-column-without-source/" /><updated>2026-09-08T17:55:03.673455+00:00</updated><summary>Build a location-only parse-error report from JSONDecodeError.lineno and colno.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/validate-json-list-contains-only-objects/</id><title>Validate a JSON list contains only objects</title><link href="https://batulabnotes.netlify.app/articles/validate-json-list-contains-only-objects/" /><updated>2026-09-08T17:55:03.673646+00:00</updated><summary>Validate each decoded list item is a dict before code assumes object methods such as get().</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/keep-unknown-json-field-forward-compatible-reporting/</id><title>Keep an unknown JSON field for forward-compatible reporting</title><link href="https://batulabnotes.netlify.app/articles/keep-unknown-json-field-forward-compatible-reporting/" /><updated>2026-09-08T17:55:03.673929+00:00</updated><summary>Validate known fields while retaining unrecognized fields for a forward-compatible report.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/build-json-pointer-like-path-while-validating-nested-fields/</id><title>Build a JSON pointer-like path while validating nested fields</title><link href="https://batulabnotes.netlify.app/articles/build-json-pointer-like-path-while-validating-nested-fields/" /><updated>2026-09-08T17:55:03.674183+00:00</updated><summary>Validate nested decoded JSON while reporting a precise $.users[0].name location.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/treat-json-iterencode-chunks-as-fragments-of-one-document/</id><title>Treat JSON iterencode chunks as fragments of one document</title><link href="https://batulabnotes.netlify.app/articles/treat-json-iterencode-chunks-as-fragments-of-one-document/" /><updated>2026-09-08T17:55:03.674402+00:00</updated><summary>Join JSONEncoder.iterencode fragments before decoding the complete JSON document.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/require-json-object-instead-of-accepting-list/</id><title>Require a JSON object instead of accepting a list</title><link href="https://batulabnotes.netlify.app/articles/require-json-object-instead-of-accepting-list/" /><updated>2026-09-08T17:55:03.674608+00:00</updated><summary>Require an exact dict after JSON decoding rather than relying on iterability.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/coerce-json-boolean-only-when-actually-bool/</id><title>Coerce a JSON boolean only when it is actually bool</title><link href="https://batulabnotes.netlify.app/articles/coerce-json-boolean-only-when-actually-bool/" /><updated>2026-09-08T17:55:03.674824+00:00</updated><summary>Accept a decoded JSON boolean only when its exact Python type is bool.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/validate-integer-json-field-without-accepting-float/</id><title>Validate an integer JSON field without accepting float</title><link href="https://batulabnotes.netlify.app/articles/validate-integer-json-field-without-accepting-float/" /><updated>2026-09-08T17:55:03.675071+00:00</updated><summary>Validate a root JSON object count as an exact Python int, rejecting arrays, floats, booleans, and duplicate root count members without rejecting nested objects.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/reject-json-array-duplicate-logical-identifier/</id><title>Reject a JSON array with a duplicate logical identifier</title><link href="https://batulabnotes.netlify.app/articles/reject-json-array-duplicate-logical-identifier/" /><updated>2026-09-08T17:55:03.675299+00:00</updated><summary>Decode an array, then enforce identifier uniqueness with an index-aware validation error.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/convert-json-timestamp-only-after-type-check/</id><title>Convert a JSON timestamp field only after a type check</title><link href="https://batulabnotes.netlify.app/articles/convert-json-timestamp-only-after-type-check/" /><updated>2026-09-08T17:55:03.675503+00:00</updated><summary>Decode JSON first, demonstrate the type errors from unchecked parsing, then parse only the documented string timestamp form.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-object-hook-construct-tiny-value-object/</id><title>Use object_hook to construct a tiny value object</title><link href="https://batulabnotes.netlify.app/articles/use-object-hook-construct-tiny-value-object/" /><updated>2026-09-08T17:55:03.675713+00:00</updated><summary>Limit a JSON object_hook to an exact tagged shape before creating a Point value object.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/keep-json-decoding-separate-domain-validation/</id><title>Keep JSON decoding separate from domain validation</title><link href="https://batulabnotes.netlify.app/articles/keep-json-decoding-separate-domain-validation/" /><updated>2026-09-08T17:55:03.675910+00:00</updated><summary>Treat valid JSON syntax as a separate concern from a non-negative count business rule.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/project-cyclic-dataclass-graph-without-asdict-recursively/</id><title>Project a cyclic dataclass graph without calling asdict recursively</title><link href="https://batulabnotes.netlify.app/articles/project-cyclic-dataclass-graph-without-asdict-recursively/" /><updated>2026-09-08T17:55:03.676130+00:00</updated><summary>Replace recursive asdict on a cyclic Node with a bounded projection that emits a cycle marker.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/build-a-synthetic-json-lines-fixture-in-memory/</id><title>Build a synthetic JSON Lines fixture in memory</title><link href="https://batulabnotes.netlify.app/articles/build-a-synthetic-json-lines-fixture-in-memory/" /><updated>2026-09-08T17:55:03.676340+00:00</updated><summary>Build an in-memory JSON Lines fixture by writing one JSON object and one newline per record.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/report-the-first-invalid-json-lines-record-number/</id><title>Report the first invalid JSON Lines record number</title><link href="https://batulabnotes.netlify.app/articles/report-the-first-invalid-json-lines-record-number/" /><updated>2026-09-08T17:55:03.676542+00:00</updated><summary>Decode JSON Lines one record at a time to report the first malformed record.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/keep-a-json-schema-like-required-field-check-small/</id><title>Keep a JSON schema-like required-field check small</title><link href="https://batulabnotes.netlify.app/articles/keep-a-json-schema-like-required-field-check-small/" /><updated>2026-09-08T17:55:03.676750+00:00</updated><summary>Decode a small JSON object and report its missing required fields with a sorted set difference.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/compare-parsed-json-structures-instead-of-raw-whitespace/</id><title>Compare parsed JSON structures instead of raw whitespace</title><link href="https://batulabnotes.netlify.app/articles/compare-parsed-json-structures-instead-of-raw-whitespace/" /><updated>2026-09-08T17:55:03.676950+00:00</updated><summary>Parse equivalent JSON texts before comparison to ignore formatting-only differences.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-ensure-ascii-deliberately-for-a-text-contract/</id><title>Use ensure_ascii deliberately for a text contract</title><link href="https://batulabnotes.netlify.app/articles/use-ensure-ascii-deliberately-for-a-text-contract/" /><updated>2026-09-08T17:55:03.677140+00:00</updated><summary>Choose whether JSON fixtures escape non-ASCII characters with ensure_ascii.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/reject-non-string-json-mapping-keys-before-encoding/</id><title>Reject non-string JSON mapping keys before encoding</title><link href="https://batulabnotes.netlify.app/articles/reject-non-string-json-mapping-keys-before-encoding/" /><updated>2026-09-08T17:55:03.677338+00:00</updated><summary>Reject Python mapping keys that JSON would coerce before encoding.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/avoid-treating-an-empty-json-object-as-a-missing-value/</id><title>Avoid treating an empty JSON object as a missing value</title><link href="https://batulabnotes.netlify.app/articles/avoid-treating-an-empty-json-object-as-a-missing-value/" /><updated>2026-09-08T17:55:03.677542+00:00</updated><summary>Use an explicit None check so an empty decoded JSON object remains present.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/test-json-encoder-nested-decimal-rejection/</id><title>Test a JSON encoder with a nested Decimal rejection</title><link href="https://batulabnotes.netlify.app/articles/test-json-encoder-nested-decimal-rejection/" /><updated>2026-09-08T17:55:03.677912+00:00</updated><summary>Test that a JSON encoder rejects an unsupported Decimal even when it is nested.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/preserve-list-order-when-it-has-domain-meaning/</id><title>Preserve list order when it has domain meaning</title><link href="https://batulabnotes.netlify.app/articles/preserve-list-order-when-it-has-domain-meaning/" /><updated>2026-09-08T17:55:03.678116+00:00</updated><summary>Keep workflow steps in their supplied JSON-array order while canonicalizing only object-key presentation where the contract permits it.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/inspect-dedent-mixed-tab-space-prefixes/</id><title>Inspect how dedent treats mixed tab and space prefixes</title><link href="https://batulabnotes.netlify.app/articles/inspect-dedent-mixed-tab-space-prefixes/" /><updated>2026-09-08T17:55:03.678321+00:00</updated><summary>Make mixed indentation visible before applying an explicit tabs-to-spaces fixture policy.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/fetch-every-row-from-sqlite-update-returning-before-reading-rowcount/</id><title>Fetch every row from SQLite UPDATE RETURNING before reading rowcount</title><link href="https://batulabnotes.netlify.app/articles/fetch-every-row-from-sqlite-update-returning-before-reading-rowcount/" /><updated>2026-09-08T17:55:03.678529+00:00</updated><summary>Consume an UPDATE RETURNING cursor before trusting sqlite3.Cursor.rowcount, while keeping returned IDs separate from the change count.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/replace-sqlite-not-in-when-the-subquery-can-return-null/</id><title>Replace SQLite NOT IN when the subquery can return NULL</title><link href="https://batulabnotes.netlify.app/articles/replace-sqlite-not-in-when-the-subquery-can-return-null/" /><updated>2026-09-08T17:55:03.678740+00:00</updated><summary>Show why a NULL in a NOT IN subquery can filter every candidate, and use correlated NOT EXISTS for absence of a match.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/find-the-second-newest-row-with-order-by-and-offset/</id><title>Find the second newest row with ORDER BY and OFFSET</title><link href="https://batulabnotes.netlify.app/articles/find-the-second-newest-row-with-order-by-and-offset/" /><updated>2026-09-08T17:55:03.678937+00:00</updated><summary>Use descending ORDER BY with LIMIT 1 OFFSET 1 to select the second newest distinct-date row rather than the newest value from MAX().</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-a-case-expression-to-label-a-bounded-score/</id><title>Use a CASE expression to label a bounded score</title><link href="https://batulabnotes.netlify.app/articles/use-a-case-expression-to-label-a-bounded-score/" /><updated>2026-09-08T17:55:03.679140+00:00</updated><summary>Contrast a boolean range test with CASE labels that identify whether a score is low, acceptable, or high.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/count-distinct-non-null-values-in-a-fixture-table/</id><title>Count distinct non-null values in a fixture table</title><link href="https://batulabnotes.netlify.app/articles/count-distinct-non-null-values-in-a-fixture-table/" /><updated>2026-09-08T17:55:03.679360+00:00</updated><summary>Compare COUNT(*), COUNT(column), and COUNT(DISTINCT column) on duplicates and NULL to count distinct non-null values.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/explain-why-sum-of-no-rows-is-null/</id><title>Explain why SUM of no rows is NULL</title><link href="https://batulabnotes.netlify.app/articles/explain-why-sum-of-no-rows-is-null/" /><updated>2026-09-08T17:55:03.679555+00:00</updated><summary>Reproduce SQLite's empty-set aggregate behavior and contrast SUM with total.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-filter-with-an-aggregate-for-a-conditional-count/</id><title>Use FILTER with an aggregate for a conditional count</title><link href="https://batulabnotes.netlify.app/articles/use-filter-with-an-aggregate-for-a-conditional-count/" /><updated>2026-09-08T17:55:03.679765+00:00</updated><summary>Count each store’s paid SQLite orders with an aggregate FILTER instead of an uncorrelated global scalar subquery.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/find-rows-whose-value-is-outside-a-local-range/</id><title>Find rows whose value is outside a local range</title><link href="https://batulabnotes.netlify.app/articles/find-rows-whose-value-is-outside-a-local-range/" /><updated>2026-09-08T17:55:03.679969+00:00</updated><summary>Contrast inclusive BETWEEN with the explicit SQLite predicate for range violations.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-a-recursive-cte-to-generate-a-short-integer-series/</id><title>Use a recursive CTE to generate a short integer series</title><link href="https://batulabnotes.netlify.app/articles/use-a-recursive-cte-to-generate-a-short-integer-series/" /><updated>2026-09-08T17:55:03.680165+00:00</updated><summary>Generate a bounded inclusive SQLite integer series with a terminating recursive CTE.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/compare-two-in-memory-tables-with-except/</id><title>Compare two in-memory tables with EXCEPT</title><link href="https://batulabnotes.netlify.app/articles/compare-two-in-memory-tables-with-except/" /><updated>2026-09-08T17:55:03.680369+00:00</updated><summary>Express the distinct left-only identifier set in SQLite with EXCEPT.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/find-values-present-in-either-table-with-union/</id><title>Find values present in either table with UNION</title><link href="https://batulabnotes.netlify.app/articles/find-values-present-in-either-table-with-union/" /><updated>2026-09-08T17:55:03.680592+00:00</updated><summary>Combine values from two SQLite tables and remove the shared value with UNION.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/keep-duplicate-rows-visible-with-union-all/</id><title>Keep duplicate rows visible with UNION ALL</title><link href="https://batulabnotes.netlify.app/articles/keep-duplicate-rows-visible-with-union-all/" /><updated>2026-09-08T17:55:03.680801+00:00</updated><summary>Use UNION ALL in SQLite when two identical result rows must remain visible.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-cross-join-deliberately-for-a-small-option-matrix/</id><title>Use CROSS JOIN deliberately for a small option matrix</title><link href="https://batulabnotes.netlify.app/articles/use-cross-join-deliberately-for-a-small-option-matrix/" /><updated>2026-09-08T17:55:03.681009+00:00</updated><summary>Generate all size-and-color pairs with SQLite CROSS JOIN and verify the four-row matrix.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/set-an-explicit-whole-partition-frame-for-sqlite-last-value/</id><title>Set an explicit whole-partition frame for SQLite last_value</title><link href="https://batulabnotes.netlify.app/articles/set-an-explicit-whole-partition-frame-for-sqlite-last-value/" /><updated>2026-09-08T17:55:03.681217+00:00</updated><summary>Use an explicit ROWS frame so SQLite last_value reports the final value for every row in a partition.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/detect-ties-for-a-maximum-value-with-rank/</id><title>Detect ties for a maximum value with RANK</title><link href="https://batulabnotes.netlify.app/articles/detect-ties-for-a-maximum-value-with-rank/" /><updated>2026-09-08T17:55:03.681436+00:00</updated><summary>Use RANK() = 1 to return all SQLite rows tied for the maximum score.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-lag-to-calculate-a-change-between-ordered-rows/</id><title>Use LAG to calculate a change between ordered rows</title><link href="https://batulabnotes.netlify.app/articles/use-lag-to-calculate-a-change-between-ordered-rows/" /><updated>2026-09-08T17:55:03.681644+00:00</updated><summary>A reproducible in-memory SQLite example showing why LAG needs window ordering.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-lead-to-inspect-the-next-scheduled-value/</id><title>Use LEAD to inspect the next scheduled value</title><link href="https://batulabnotes.netlify.app/articles/use-lead-to-inspect-the-next-scheduled-value/" /><updated>2026-09-08T17:55:03.681853+00:00</updated><summary>An in-memory SQLite experiment comparing a self-join with LEAD for the next schedule time.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/compute-a-running-average-with-a-window-frame/</id><title>Compute a running average with a window frame</title><link href="https://batulabnotes.netlify.app/articles/compute-a-running-average-with-a-window-frame/" /><updated>2026-09-08T17:55:03.682054+00:00</updated><summary>A SQLite window-frame experiment that makes a two-row running average explicit.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-a-window-partition-for-per-category-totals/</id><title>Use a window partition for per-category totals</title><link href="https://batulabnotes.netlify.app/articles/use-a-window-partition-for-per-category-totals/" /><updated>2026-09-08T17:55:03.682340+00:00</updated><summary>An in-memory SQLite comparison of a global window sum and per-category totals.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/match-the-exact-expression-used-by-a-sqlite-expression-index/</id><title>Match the exact expression used by a SQLite expression index</title><link href="https://batulabnotes.netlify.app/articles/match-the-exact-expression-used-by-a-sqlite-expression-index/" /><updated>2026-09-08T17:55:03.682588+00:00</updated><summary>A reproducible EXPLAIN QUERY PLAN comparison for x+y and y+x against an expression index.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-a-covering-index-for-a-narrow-lookup/</id><title>Use a covering index for a narrow lookup</title><link href="https://batulabnotes.netlify.app/articles/use-a-covering-index-for-a-narrow-lookup/" /><updated>2026-09-08T17:55:03.682823+00:00</updated><summary>Verify that a SQLite lookup can return its selected column from an index alone.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/check-an-index-definition-with-pragma-index-info/</id><title>Check an index definition with PRAGMA index_info</title><link href="https://batulabnotes.netlify.app/articles/check-an-index-definition-with-pragma-index-info/" /><updated>2026-09-08T17:55:03.683049+00:00</updated><summary>Verify both the ordered columns and partial-index status of a SQLite index in an in-memory test.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/inspect-foreign-key-violations-in-an-in-memory-database/</id><title>Inspect foreign-key violations in an in-memory database</title><link href="https://batulabnotes.netlify.app/articles/inspect-foreign-key-violations-in-an-in-memory-database/" /><updated>2026-09-08T17:55:03.683271+00:00</updated><summary>Use PRAGMA foreign_key_check to reveal an orphaned child row in a synthetic SQLite fixture.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-sqlite3-row-with-duplicate-column-aliases-carefully/</id><title>Use sqlite3.Row with duplicate column aliases carefully</title><link href="https://batulabnotes.netlify.app/articles/use-sqlite3-row-with-duplicate-column-aliases-carefully/" /><updated>2026-09-08T17:55:03.683477+00:00</updated><summary>Avoid ambiguous sqlite3.Row key access by assigning distinct SQL aliases.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/bind-an-in-list-by-creating-placeholders-from-trusted-length/</id><title>Bind an IN list by creating placeholders from trusted length</title><link href="https://batulabnotes.netlify.app/articles/bind-an-in-list-by-creating-placeholders-from-trusted-length/" /><updated>2026-09-08T17:55:03.683670+00:00</updated><summary>Generate one SQLite placeholder per IN-list value and bind the values separately.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/avoid-string-formatting-sql-order-by-direction/</id><title>Avoid string-formatting a SQL ORDER BY direction</title><link href="https://batulabnotes.netlify.app/articles/avoid-string-formatting-sql-order-by-direction/" /><updated>2026-09-08T17:55:03.683871+00:00</updated><summary>Reject untrusted ORDER BY directions and map approved values to fixed SQL tokens.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/read-only-select-transaction-consistent-fixture-snapshot/</id><title>Use a read-only SELECT transaction for a consistent fixture snapshot</title><link href="https://batulabnotes.netlify.app/articles/read-only-select-transaction-consistent-fixture-snapshot/" /><updated>2026-09-08T17:55:03.684073+00:00</updated><summary>Keep related reads on one SQLite snapshot with an explicit transaction.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/set-busy-timeout-bounded-local-policy/</id><title>Set a busy timeout only as a bounded local policy</title><link href="https://batulabnotes.netlify.app/articles/set-busy-timeout-bounded-local-policy/" /><updated>2026-09-08T17:55:03.684266+00:00</updated><summary>Use sqlite3 connection timeouts as a short, explicit contention policy rather than unbounded retries.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-connection-total-changes-controlled-fixture-update/</id><title>Use connection total_changes for a controlled fixture update</title><link href="https://batulabnotes.netlify.app/articles/use-connection-total-changes-controlled-fixture-update/" /><updated>2026-09-08T17:55:03.684479+00:00</updated><summary>Measure one known SQLite update using a Connection.total_changes delta.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/explain-sqlite3-cursor-rowcount-after-select/</id><title>Explain sqlite3 cursor rowcount after SELECT</title><link href="https://batulabnotes.netlify.app/articles/explain-sqlite3-cursor-rowcount-after-select/" /><updated>2026-09-08T17:55:03.684691+00:00</updated><summary>Use fetched result length, not Cursor.rowcount, to count SQLite SELECT results.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/parse-fixed-point-amount-reject-currency-text/</id><title>Parse a fixed-point amount while rejecting surrounding currency text</title><link href="https://batulabnotes.netlify.app/articles/parse-fixed-point-amount-reject-currency-text/" /><updated>2026-09-08T17:55:03.684879+00:00</updated><summary>Keep a permitted currency column separate from a strict fixed-point amount token, then validate the whole amount field before Decimal conversion.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/decimal-compare-total-sort-special-values/</id><title>Use Decimal compare_total for a deterministic sort of special values</title><link href="https://batulabnotes.netlify.app/articles/decimal-compare-total-sort-special-values/" /><updated>2026-09-08T17:55:03.685069+00:00</updated><summary>Adapt Decimal.compare_total with functools.cmp_to_key to sort signed zero and NaN representations without relying on ordinary numeric equality.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/decimal-signed-zero-display-policy/</id><title>Preserve or collapse Decimal signed zero by an explicit display policy</title><link href="https://batulabnotes.netlify.app/articles/decimal-signed-zero-display-policy/" /><updated>2026-09-08T17:55:03.685254+00:00</updated><summary>Make Decimal signed zero visible and choose a declared rendering policy instead of letting equality erase the distinction.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/decimal-localcontext-temporary-precision/</id><title>Use localcontext to isolate a temporary Decimal precision change</title><link href="https://batulabnotes.netlify.app/articles/decimal-localcontext-temporary-precision/" /><updated>2026-09-08T17:55:03.685428+00:00</updated><summary>Use decimal.localcontext to calculate at a temporary precision without leaking that setting to later Decimal work.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/trap-decimal-division-by-zero-validation/</id><title>Trap Decimal division by zero in a validation helper</title><link href="https://batulabnotes.netlify.app/articles/trap-decimal-division-by-zero-validation/" /><updated>2026-09-08T17:55:03.685609+00:00</updated><summary>Turn a Decimal DivisionByZero signal into a structured validation result instead of allowing Infinity through.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/detect-inexact-decimal-operation-with-context-flags/</id><title>Detect an inexact Decimal operation with context flags</title><link href="https://batulabnotes.netlify.app/articles/detect-inexact-decimal-operation-with-context-flags/" /><updated>2026-09-08T17:55:03.685783+00:00</updated><summary>Detect precision loss from Decimal division by clearing and checking the Inexact context flag.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/convert-integer-minor-unit-amount-to-decimal-safely/</id><title>Convert an integer minor-unit amount to Decimal safely</title><link href="https://batulabnotes.netlify.app/articles/convert-integer-minor-unit-amount-to-decimal-safely/" /><updated>2026-09-08T17:55:03.685958+00:00</updated><summary>Convert integer minor units using Decimal.scaleb with a local precision sufficient for the integer coefficient.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/measure-fraction-limit-denominator-approximation-error-exactly/</id><title>Measure Fraction limit_denominator approximation error exactly</title><link href="https://batulabnotes.netlify.app/articles/measure-fraction-limit-denominator-approximation-error-exactly/" /><updated>2026-09-08T17:55:03.686145+00:00</updated><summary>Approximate a Fraction under a denominator cap and report its exact residual.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/compute-percentage-from-decimal-values-without-float-conversion/</id><title>Compute a percentage from Decimal values without float conversion</title><link href="https://batulabnotes.netlify.app/articles/compute-percentage-from-decimal-values-without-float-conversion/" /><updated>2026-09-08T17:55:03.686359+00:00</updated><summary>Keep Decimal records unchanged, expose the float-conversion boundary, and calculate an exact 37.5 percent with a local Decimal context.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/reject-negative-quantity-before-multiplying-an-amount/</id><title>Reject a negative quantity before multiplying an amount</title><link href="https://batulabnotes.netlify.app/articles/reject-negative-quantity-before-multiplying-an-amount/" /><updated>2026-09-08T17:55:03.686558+00:00</updated><summary>Validate a negative quantity before calculating a Decimal line total.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/assign-values-to-half-open-intervals-with-bisect-boundaries/</id><title>Assign values to half-open intervals with bisect boundaries</title><link href="https://batulabnotes.netlify.app/articles/assign-values-to-half-open-intervals-with-bisect-boundaries/" /><updated>2026-09-08T17:55:03.686742+00:00</updated><summary>Use bisect_left or bisect_right as an explicit, tested interval-boundary policy.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/group-records-by-two-selected-mapping-fields/</id><title>Group records by two selected mapping fields</title><link href="https://batulabnotes.netlify.app/articles/group-records-by-two-selected-mapping-fields/" /><updated>2026-09-08T17:55:03.686945+00:00</updated><summary>Group records by a tuple made from exactly the fields that define the group.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/choose-explicit-byte-order-to-avoid-native-struct-padding/</id><title>Choose explicit byte order to avoid native struct padding</title><link href="https://batulabnotes.netlify.app/articles/choose-explicit-byte-order-to-avoid-native-struct-padding/" /><updated>2026-09-08T17:55:03.687151+00:00</updated><summary>Specify a standard struct prefix for portable binary wire records.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/pivot-small-in-memory-records-into-totals/</id><title>Pivot a small in-memory list of records into totals</title><link href="https://batulabnotes.netlify.app/articles/pivot-small-in-memory-records-into-totals/" /><updated>2026-09-08T17:55:03.687700+00:00</updated><summary>Accumulate Decimal amounts by category without mutating the source records.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/unpivot-fixed-mapping-into-name-value-rows/</id><title>Unpivot a fixed mapping into name-value rows</title><link href="https://batulabnotes.netlify.app/articles/unpivot-fixed-mapping-into-name-value-rows/" /><updated>2026-09-08T17:55:03.688047+00:00</updated><summary>Emit name-value rows in an explicit schema order rather than mapping insertion order.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/join-two-mapping-lists-on-a-unique-synthetic-key/</id><title>Join two mapping lists on a unique synthetic key</title><link href="https://batulabnotes.netlify.app/articles/join-two-mapping-lists-on-a-unique-synthetic-key/" /><updated>2026-09-08T17:55:03.688310+00:00</updated><summary>Validate synthetic-key uniqueness before joining mapping lists so duplicate records cannot multiply result rows unnoticed.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/report-keys-present-only-on-one-side-of-two-mappings/</id><title>Report keys present only on one side of two mappings</title><link href="https://batulabnotes.netlify.app/articles/report-keys-present-only-on-one-side-of-two-mappings/" /><updated>2026-09-08T17:55:03.688509+00:00</updated><summary>Compare mapping key sets, rather than values, to report keys missing from either side.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/apply-a-whitelist-of-allowed-mapping-fields/</id><title>Apply a whitelist of allowed mapping fields</title><link href="https://batulabnotes.netlify.app/articles/apply-a-whitelist-of-allowed-mapping-fields/" /><updated>2026-09-08T17:55:03.688798+00:00</updated><summary>Build a new mapping from explicitly allowed fields so unwanted fields are not copied.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/rename-selected-mapping-fields-without-mutating-the-input/</id><title>Rename selected mapping fields without mutating the input</title><link href="https://batulabnotes.netlify.app/articles/rename-selected-mapping-fields-without-mutating-the-input/" /><updated>2026-09-08T17:55:03.689095+00:00</updated><summary>Build a renamed mapping with a comprehension instead of using pop on caller-owned data.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/avoid-eager-default-construction-when-dict-get-finds-an-existing-value/</id><title>Avoid eager default construction when dict.get finds an existing value</title><link href="https://batulabnotes.netlify.app/articles/avoid-eager-default-construction-when-dict-get-finds-an-existing-value/" /><updated>2026-09-08T17:55:03.689353+00:00</updated><summary>Use an explicit key-membership branch when a fallback factory must run only for a missing key, even when a stored value is None.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/observe-independent-positions-after-splitting-an-iterator-with-tee/</id><title>Observe independent positions after splitting an iterator with tee</title><link href="https://batulabnotes.netlify.app/articles/observe-independent-positions-after-splitting-an-iterator-with-tee/" /><updated>2026-09-08T17:55:03.689611+00:00</updated><summary>A five-line transcript shows that tee branches advance independently.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/sort-casefold-colliding-unicode-labels-with-a-deterministic-tie-breaker/</id><title>Sort casefold-colliding Unicode labels with a deterministic tie breaker</title><link href="https://batulabnotes.netlify.app/articles/sort-casefold-colliding-unicode-labels-with-a-deterministic-tie-breaker/" /><updated>2026-09-08T17:55:03.690147+00:00</updated><summary>Make Unicode casefold collisions visible, then choose either display text or a stable record ID as the explicit tie-breaking policy.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/use-min-and-max-together-for-a-range-summary/</id><title>Use min and max together for a range summary</title><link href="https://batulabnotes.netlify.app/articles/use-min-and-max-together-for-a-range-summary/" /><updated>2026-09-08T17:55:03.690553+00:00</updated><summary>A guarded one-pass loop summarizes a one-shot iterator and returns None for empty input.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/calculate-a-bounded-moving-average-from-a-short-list/</id><title>Calculate a bounded moving average from a short list</title><link href="https://batulabnotes.netlify.app/articles/calculate-a-bounded-moving-average-from-a-short-list/" /><updated>2026-09-08T17:55:03.690880+00:00</updated><summary>A deque retains only full three-value windows and skips partial averages.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/reject-trailing-text-in-a-datetime-field-instead-of-slicing-it-away/</id><title>Reject trailing text in a datetime field instead of slicing it away</title><link href="https://batulabnotes.netlify.app/articles/reject-trailing-text-in-a-datetime-field-instead-of-slicing-it-away/" /><updated>2026-09-08T17:55:03.691152+00:00</updated><summary>Parse the complete field so unexpected trailing text becomes a visible validation error.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/find-first-record-that-violates-monotonic-order/</id><title>Find the first record that violates monotonic order</title><link href="https://batulabnotes.netlify.app/articles/find-first-record-that-violates-monotonic-order/" /><updated>2026-09-08T17:55:03.691419+00:00</updated><summary>Detect the first descending timestamp in source order without sorting away the evidence.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/build-histogram-from-integer-buckets/</id><title>Build a histogram from integer buckets</title><link href="https://batulabnotes.netlify.app/articles/build-histogram-from-integer-buckets/" /><updated>2026-09-08T17:55:03.691645+00:00</updated><summary>Count fixed-width integer buckets with floor division while preserving the input records.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/normalize-percentages-total-exactly-100/</id><title>Normalize percentages so the displayed total is exactly 100</title><link href="https://batulabnotes.netlify.app/articles/normalize-percentages-total-exactly-100/" /><updated>2026-09-08T17:55:03.691860+00:00</updated><summary>Use Decimal and largest-remainder allocation to make displayed percentages total 100.00.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/select-smallest-records-explicit-stable-heap-tie-key/</id><title>Select the smallest records with an explicit stable heap tie key</title><link href="https://batulabnotes.netlify.app/articles/select-smallest-records-explicit-stable-heap-tie-key/" /><updated>2026-09-08T17:55:03.692103+00:00</updated><summary>Use heapq.nsmallest with original indexes to state the equal-score tie contract.</summary></entry><entry><id>https://batulabnotes.netlify.app/articles/fail-missing-string-template-placeholders-before-shipping-report/</id><title>Fail on missing string.Template placeholders before shipping a report</title><link href="https://batulabnotes.netlify.app/articles/fail-missing-string-template-placeholders-before-shipping-report/" /><updated>2026-09-08T17:55:03.692383+00:00</updated><summary>Use strict Template substitution to reject incomplete report data while preserving literal dollars.</summary></entry></feed>