Skip to content

Latest commit

 

History

1,872 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

multidict

GitHub status for master branch Coverage metrics PyPI Read The Docs build status badge CodSpeed Python versions Matrix Room — #aio-libs:matrix.org Matrix Space — #aio-libs-space:matrix.org

Multidict is dict-like collection of key-value pairs where key might occur more than once in the container.

Introduction

HTTP Headers and URL query string require specific data structure: multidict. It behaves mostly like a regular dict but it may have several values for the same key and preserves insertion ordering.

The key is str (or istr for case-insensitive dictionaries).

multidict has four multidict classes: MultiDict, MultiDictProxy, CIMultiDict and CIMultiDictProxy.

Immutable proxies (MultiDictProxy and CIMultiDictProxy) provide a dynamic view for the proxied multidict, the view reflects underlying collection changes. They implement the collections.abc.Mapping interface.

Regular mutable (MultiDict and CIMultiDict) classes implement collections.abc.MutableMapping and allows them to change their own content.

Case insensitive (CIMultiDict and CIMultiDictProxy) assume the keys are case insensitive, e.g.

>>> dct = CIMultiDict(key='val')
>>> 'Key' in dct
True
>>> dct['Key']
'val'

Keys should be str or istr instances.

The library has optional C Extensions for speed.

Both the C extension and the pure-Python fallback are optimized for free-threaded (no-GIL) Python as well as the regular GIL build, and their performance is in the same ballpark as the built-in dict, typically within 20-30% for common operations, since dict itself benefits from per-version interpreter specializations that a third-party type cannot hook into. See the benchmarks page for the full per-operation breakdown of the C extension on both builds, and the free-threading overhead figures for the pure-Python fallback.

License

Apache 2

Library Installation

$ pip install multidict

The library is Python 3 only!

PyPI contains binary wheels for Linux, Windows and MacOS. If you want to install multidict on another operating system (or Alpine Linux inside a Docker) the tarball will be used to compile the library from source. It requires a C compiler and Python headers to be installed.

To skip the compilation, please use the MULTIDICT_NO_EXTENSIONS environment variable, e.g.:

$ MULTIDICT_NO_EXTENSIONS=1 pip install multidict

Please note, the pure Python (uncompiled) version is dramatically slower: the pure-Python backend table measures it at roughly 7 to 80 times more instructions than the C extension, depending on the operation. Unless the target platform genuinely cannot build the C extension, leave MULTIDICT_NO_EXTENSIONS unset and let it compile.

For extension development, set the MULTIDICT_DEBUG_BUILD environment variable to compile the extensions in debug mode:

$ MULTIDICT_DEBUG_BUILD=1 pip install multidict

Changelog

See RTD page.

About

The multidict implementation

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

494 stars

Watchers

14 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages