Commit 4c7a46eb authored by Paul Dagnelie's avatar Paul Dagnelie Committed by Ivan Levkivskyi

bpo-36972: Add SupportsIndex (GH-13448)

In order to support typing checks calling hex(), oct() and bin() on user-defined classes, a SupportIndex protocol is required. The ability to check these at runtime would be good to add for completeness sake. This is pretty much just a copy of SupportsInt with the names tweaked.
parent 33e71e01
...@@ -529,6 +529,12 @@ The module defines the following classes, functions and decorators: ...@@ -529,6 +529,12 @@ The module defines the following classes, functions and decorators:
An ABC with one abstract method ``__bytes__``. An ABC with one abstract method ``__bytes__``.
.. class:: SupportsIndex
An ABC with one abstract method ``__index__``.
.. versionadded:: 3.8
.. class:: SupportsAbs .. class:: SupportsAbs
An ABC with one abstract method ``__abs__`` that is covariant An ABC with one abstract method ``__abs__`` that is covariant
......
...@@ -568,6 +568,10 @@ class ProtocolTests(BaseTestCase): ...@@ -568,6 +568,10 @@ class ProtocolTests(BaseTestCase):
self.assertIsSubclass(list, typing.Reversible) self.assertIsSubclass(list, typing.Reversible)
self.assertNotIsSubclass(int, typing.Reversible) self.assertNotIsSubclass(int, typing.Reversible)
def test_supports_index(self):
self.assertIsSubclass(int, typing.SupportsIndex)
self.assertNotIsSubclass(str, typing.SupportsIndex)
def test_protocol_instance_type_error(self): def test_protocol_instance_type_error(self):
with self.assertRaises(TypeError): with self.assertRaises(TypeError):
isinstance(0, typing.SupportsAbs) isinstance(0, typing.SupportsAbs)
......
...@@ -74,6 +74,7 @@ __all__ = [ ...@@ -74,6 +74,7 @@ __all__ = [
'SupportsBytes', 'SupportsBytes',
'SupportsComplex', 'SupportsComplex',
'SupportsFloat', 'SupportsFloat',
'SupportsIndex',
'SupportsInt', 'SupportsInt',
'SupportsRound', 'SupportsRound',
...@@ -1304,6 +1305,14 @@ class SupportsBytes(_Protocol): ...@@ -1304,6 +1305,14 @@ class SupportsBytes(_Protocol):
pass pass
class SupportsIndex(_Protocol):
__slots__ = ()
@abstractmethod
def __index__(self) -> int:
pass
class SupportsAbs(_Protocol[T_co]): class SupportsAbs(_Protocol[T_co]):
__slots__ = () __slots__ = ()
......
...@@ -355,6 +355,7 @@ Tom Culliton ...@@ -355,6 +355,7 @@ Tom Culliton
Raúl Cumplido Raúl Cumplido
Antonio Cuni Antonio Cuni
Brian Curtin Brian Curtin
Paul Dagnelie
Lisandro Dalcin Lisandro Dalcin
Darren Dale Darren Dale
Andrew Dalke Andrew Dalke
......
Add SupportsIndex protocol to the typing module to allow type checking to detect classes that can be passed to `hex()`, `oct()` and `bin()`.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment