{"library":"multidict","title":"multidict","description":"multidict is a mapping implementation that allows multiple values per key, mirroring the semantics of HTTP headers and query strings. It provides four concrete classes — MultiDict (mutable), MultiDictProxy (immutable view), CIMultiDict (case-insensitive mutable), and CIMultiDictProxy (case-insensitive immutable view) — plus the istr helper for pre-folded string keys. Current version is 6.7.1 (released January 2026). The library ships an optional C extension; release cadence is frequent patch releases with periodic minor releases adding features such as the new merge() method (6.6.0) and a hash-table backend replacing the previous O(N) array (6.5.0).","language":"python","status":"active","last_verified":"Tue May 12","install":{"commands":["pip install multidict"],"cli":null},"imports":["from multidict import MultiDict","from multidict import CIMultiDict","from multidict import MultiDictProxy","from multidict import CIMultiDictProxy","from multidict import istr","d.getall('key')"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"from multidict import MultiDict, MultiDictProxy, CIMultiDict, istr\n\n# --- Mutable multi-valued dict ---\nd = MultiDict([('a', 1), ('b', 2), ('a', 3)])\nassert d['a'] == 1              # returns FIRST value only\nassert d.getall('a') == [1, 3] # all values for key\nd.add('b', 99)                  # append without replacing\nassert len(d) == 4\n\n# --- set() replaces ALL entries for that key ---\nd['a'] = 99\nassert d.getall('a') == [99]\n\n# --- Read-only proxy (dynamic view) ---\nproxy = MultiDictProxy(d)\nassert proxy['b'] == 2\nd.add('b', 42)\nassert proxy.getall('b') == [2, 99, 42]  # proxy reflects changes\n\n# --- Case-insensitive dict ---\nci = CIMultiDict(Content_Type='application/json')\nassert 'content-type' in ci\nassert ci['CONTENT-TYPE'] == 'application/json'\n\n# --- istr for pre-folded keys (performance) ---\nHDR = istr('Content-Type')\nassert ci[HDR] == 'application/json'\n\n# --- merge (6.6+): copies key only if not already present ---\nbase = MultiDict(a=1)\nbase.merge(MultiDict(a=99, b=2))\nassert base['a'] == 1   # not overwritten\nassert base['b'] == 2\n","lang":"python","description":"Demonstrates mutable MultiDict with duplicate keys, getall, add, and a case-insensitive CIMultiDict.","tag":"stale","tag_description":"widespread failures or data too old to trust","last_tested":"2026-04-23","results":[{"runtime":"python:3.10-alpine","exit_code":1},{"runtime":"python:3.10-slim","exit_code":1},{"runtime":"python:3.11-alpine","exit_code":1},{"runtime":"python:3.11-slim","exit_code":1},{"runtime":"python:3.12-alpine","exit_code":1},{"runtime":"python:3.12-slim","exit_code":1},{"runtime":"python:3.13-alpine","exit_code":1},{"runtime":"python:3.13-slim","exit_code":1},{"runtime":"python:3.9-alpine","exit_code":1},{"runtime":"python:3.9-slim","exit_code":1}]},"compatibility":{"tag":"verified","tag_description":"installs cleanly on critical runtimes, fast import, recently tested","last_tested":"2026-05-12","installed_version":null,"pypi_latest":null,"is_stale":null,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":null,"avg_import_s":0.02,"wheel_type":null},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"multidict","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.03,"mem_mb":1.3,"disk_size":"18.8M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"multidict","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.02,"mem_mb":1.3,"disk_size":"19M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"multidict","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.03,"mem_mb":1,"disk_size":"20.3M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"multidict","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.03,"mem_mb":1,"disk_size":"21M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"multidict","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.02,"mem_mb":0.7,"disk_size":"12.2M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"multidict","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.02,"mem_mb":0.7,"disk_size":"13M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"multidict","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.02,"mem_mb":0.8,"disk_size":"11.8M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"multidict","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.01,"mem_mb":0.6,"disk_size":"13M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"multidict","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.02,"mem_mb":1.2,"disk_size":"18.2M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"multidict","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.02,"mem_mb":1.2,"disk_size":"19M"}]}}