gh-128427: Add uuid.NIL and uuid.MAX (#128429)

This commit is contained in:
Nick Pope 2025-01-27 16:17:17 +00:00 committed by GitHub
parent d8e16ef703
commit 8ec76d9034
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 89 additions and 0 deletions

View file

@ -289,6 +289,25 @@ of the :attr:`~UUID.variant` attribute:
Reserved for future definition. Reserved for future definition.
The :mod:`uuid` module defines the special Nil and Max UUID values:
.. data:: NIL
A special form of UUID that is specified to have all 128 bits set to zero
according to :rfc:`RFC 9562, §5.9 <9562#section-5.9>`.
.. versionadded:: next
.. data:: MAX
A special form of UUID that is specified to have all 128 bits set to one
according to :rfc:`RFC 9562, §5.10 <9562#section-5.10>`.
.. versionadded:: next
.. seealso:: .. seealso::
:rfc:`9562` - A Universally Unique IDentifier (UUID) URN Namespace :rfc:`9562` - A Universally Unique IDentifier (UUID) URN Namespace
@ -380,6 +399,14 @@ Here are some examples of typical usage of the :mod:`uuid` module::
>>> uuid.UUID(bytes=x.bytes) >>> uuid.UUID(bytes=x.bytes)
UUID('00010203-0405-0607-0809-0a0b0c0d0e0f') UUID('00010203-0405-0607-0809-0a0b0c0d0e0f')
>>> # get the Nil UUID
>>> uuid.NIL
UUID('00000000-0000-0000-0000-000000000000')
>>> # get the Max UUID
>>> uuid.MAX
UUID('ffffffff-ffff-ffff-ffff-ffffffffffff')
.. _uuid-cli-example: .. _uuid-cli-example:

View file

@ -731,6 +731,11 @@ uuid
in :rfc:`9562`. in :rfc:`9562`.
(Contributed by Bénédikt Tran in :gh:`89083`.) (Contributed by Bénédikt Tran in :gh:`89083`.)
* :const:`uuid.NIL` and :const:`uuid.MAX` are now available to represent the
Nil and Max UUID formats as defined by :rfc:`9562`.
(Contributed by Nick Pope in :gh:`128427`.)
zipinfo zipinfo
------- -------

View file

@ -34,6 +34,47 @@ def mock_get_command_stdout(data):
class BaseTestUUID: class BaseTestUUID:
uuid = None uuid = None
def test_nil_uuid(self):
nil_uuid = self.uuid.NIL
s = '00000000-0000-0000-0000-000000000000'
i = 0
self.assertEqual(nil_uuid, self.uuid.UUID(s))
self.assertEqual(nil_uuid, self.uuid.UUID(int=i))
self.assertEqual(nil_uuid.int, i)
self.assertEqual(str(nil_uuid), s)
# The Nil UUID falls within the range of the Apollo NCS variant as per
# RFC 9562.
# See https://www.rfc-editor.org/rfc/rfc9562.html#section-5.9-4
self.assertEqual(nil_uuid.variant, self.uuid.RESERVED_NCS)
# A version field of all zeros is "Unused" in RFC 9562, but the version
# field also only applies to the 10xx variant, i.e. the variant
# specified in RFC 9562. As such, because the Nil UUID falls under a
# different variant, its version is considered undefined.
# See https://www.rfc-editor.org/rfc/rfc9562.html#table2
self.assertIsNone(nil_uuid.version)
def test_max_uuid(self):
max_uuid = self.uuid.MAX
s = 'ffffffff-ffff-ffff-ffff-ffffffffffff'
i = (1 << 128) - 1
self.assertEqual(max_uuid, self.uuid.UUID(s))
self.assertEqual(max_uuid, self.uuid.UUID(int=i))
self.assertEqual(max_uuid.int, i)
self.assertEqual(str(max_uuid), s)
# The Max UUID falls within the range of the "yet-to-be defined" future
# UUID variant as per RFC 9562.
# See https://www.rfc-editor.org/rfc/rfc9562.html#section-5.10-4
self.assertEqual(max_uuid.variant, self.uuid.RESERVED_FUTURE)
# A version field of all ones is "Reserved for future definition" in
# RFC 9562, but the version field also only applies to the 10xx
# variant, i.e. the variant specified in RFC 9562. As such, because the
# Max UUID falls under a different variant, its version is considered
# undefined.
# See https://www.rfc-editor.org/rfc/rfc9562.html#table2
self.assertIsNone(max_uuid.version)
def test_safe_uuid_enum(self): def test_safe_uuid_enum(self):
class CheckedSafeUUID(enum.Enum): class CheckedSafeUUID(enum.Enum):
safe = 0 safe = 0

View file

@ -42,6 +42,14 @@ Typical usage:
# make a UUID from a 16-byte string # make a UUID from a 16-byte string
>>> uuid.UUID(bytes=x.bytes) >>> uuid.UUID(bytes=x.bytes)
UUID('00010203-0405-0607-0809-0a0b0c0d0e0f') UUID('00010203-0405-0607-0809-0a0b0c0d0e0f')
# get the Nil UUID
>>> uuid.NIL
UUID('00000000-0000-0000-0000-000000000000')
# get the Max UUID
>>> uuid.MAX
UUID('ffffffff-ffff-ffff-ffff-ffffffffffff')
""" """
import os import os
@ -830,5 +838,10 @@ NAMESPACE_URL = UUID('6ba7b811-9dad-11d1-80b4-00c04fd430c8')
NAMESPACE_OID = UUID('6ba7b812-9dad-11d1-80b4-00c04fd430c8') NAMESPACE_OID = UUID('6ba7b812-9dad-11d1-80b4-00c04fd430c8')
NAMESPACE_X500 = UUID('6ba7b814-9dad-11d1-80b4-00c04fd430c8') NAMESPACE_X500 = UUID('6ba7b814-9dad-11d1-80b4-00c04fd430c8')
# RFC 9562 Sections 5.9 and 5.10 define the special Nil and Max UUID formats.
NIL = UUID('00000000-0000-0000-0000-000000000000')
MAX = UUID('ffffffff-ffff-ffff-ffff-ffffffffffff')
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View file

@ -1475,6 +1475,7 @@ Michael Pomraning
Martin Pool Martin Pool
Iustin Pop Iustin Pop
Claudiu Popa Claudiu Popa
Nick Pope
John Popplewell John Popplewell
Matheus Vieira Portela Matheus Vieira Portela
Davin Potts Davin Potts

View file

@ -0,0 +1,2 @@
:const:`uuid.NIL` and :const:`uuid.MAX` are now available to represent the Nil
and Max UUID formats as defined by :rfc:`9562`.