key_set
Requires Python 3.12+
Installation
pip install key-set
Overview
Lightweight, zero-dependency library implementing 4 KeySet types representing set theory concepts:
- All (𝕌): Universal set - contains everything
- None (∅): Empty set
- Some: Finite subset of elements
- AllExceptSome: Complement of a finite set
Operations like intersect, union, difference are algebraically correct. You can also check inclusion with includes(element) or use element in keyset.
Python port of KeySet in TypeScript and KeySet in Ruby
Limitations
- for now, only KeySet of strings
- no ComposedKeySet yet (see KeySet in TypeScript)
KeySetType enum
Enum that represents the 4 types of KeySets:
ALLrepresents the entirety of possible keys (𝕌)NONErepresents an empty set (∅)SOMErepresents a concrete set (A ⊂ 𝕌)ALL_EXCEPT_SOMErepresents the complementary of a set, all the elements except the given ones (A' = {x ∈ 𝕌 | x ∉ A}) _(see Complement in Wikipedia)*
Creation
Build your KeySets using the build functions
from key_set import build_all, build_none, build_some_or_none, build_all_except_some_or_all
build_all() # => returns a new instance of KeySetAll
build_none() # => returns a new instance of KeySetNone
build_some_or_none([]) # returns a new instance of KeySetNone
# returns a new instance of KeySetSome with keys {'a', 'b', 'c'} (in a unique set)
build_some_or_none({'a', 'c', 'b'})
build_some_or_none(['a', 'c', 'b', 'c'])
build_all_except_some_or_all([]) # returns a new instance of KeySetAll
# returns a new instance of KeySetAllExceptSome with keys {'a', 'b', 'c'} (in a unique set)
build_all_except_some_or_all({'a', 'c', 'b'})
build_all_except_some_or_all(['a', 'c', 'b', 'c'])
KeySet classes
Methods exposed:
key_set_type()
returns the KeySetType enum
elements()
returns the set with the elements. It will be blank for All and None.
represents_xxx() methods
represents_all: returns True if the KeySet is ALLrepresents_none: returns True if the KeySet is NONErepresents_some: returns True if the KeySet is SOMErepresents_all_except_some: returns True if the KeySet is ALL_EXCEPT_SOME
invert()
Returns a new KeySet that represents the inverse Set of this one.
ALL<->NONESOME<->ALL_EXCEPT_SOME
intersect(other)
Returns a new KeySet with the intersection (A ∩ B) of both Sets: a set that contains the elements included in both sets.
union(other)
Returns a new KeySet with the union (A ∪ B) of both Sets: a set that contains the elements in any of the sets.
difference(other)
Returns a new KeySet with the difference (A - B) of the Sets: a set that contains the elements of A that are not in B.
includes(element)
Returns True if the set that this KeySet represents contains the given element.
clone()
Returns a new KeySet with the same elements.
Hashability
All KeySet classes are hashable and can be used as dictionary keys or in sets:
from key_set import KeySetSome, KeySetAll
cache = {
KeySetAll(): "all data",
KeySetSome({'a', 'b'}): "partial data",
}
unique_keysets = {KeySetSome({'a'}), KeySetSome({'a'})} # contains 1 element
len() support
KeySetNone, KeySetSome, and KeySetAllExceptSome support len():
len(KeySetNone()) # 0
len(KeySetSome({'a', 'b'})) # 2
len(KeySetAllExceptSome({'a', 'b'})) # 2 (number of excluded elements)
KeySetAll represents an infinite set, so by default len() raises TypeError:
len(KeySetAll()) # raises TypeError
Compatibility mode for KeySetAll
If you need len() to work on all KeySet types (e.g., for code that expects all objects to support len()), you can enable compatibility mode:
from key_set import KeySetAll
KeySetAll.enable_compat_len(True)
len(KeySetAll()) # returns sys.maxsize
KeySetAll.enable_compat_len(False) # restore default behavior
len(KeySetAll()) # raises TypeError again
Metadata
Release files for key-set 2.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| key_set-2.0.0.tar.gz | 68.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| key_set-2.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 79.2 kB
Release files / key_set-2.0.0.tar.gz
| Download URL | key_set-2.0.0.tar.gz |
|---|---|
| Size | 68.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
61a4ec07ad43246e7dcf6c2f5a97e81b761c28340b51308f04d1c2f4931b749a
|
|
BLAKE2b-256 checksum How to use checksums |
28deecaec05ec81ab17ffa0d45de5d4a33e7205fb809f7633d411d5e90aeec5f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jan 16, 2026.
Transparency logRelease files / key_set-2.0.0-py3-none-any.whl
| Download URL | key_set-2.0.0-py3-none-any.whl |
|---|---|
| Size | 10.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4894c85b0e19c344d3b23623877391cc040518c7f9d12493127280b2c88eccfb
|
|
BLAKE2b-256 checksum How to use checksums |
88b3f33494d5a44a8d623b584825bf9d51026e9ed246d0054992edae4e432024
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jan 16, 2026.
Transparency log