Mercurial > hg
comparison mercurial/util.py @ 51938:fa7059f031a9
interfaces: introduce and use a protocol class for the `base85` module
See f2832de2a46c for details when this was done for the `bdiff` module.
It looks like PEP-688 removed the special casing of `bytes` being a standin
for any type of `ByteString`, and defines a `typing.Buffer` class (with a
backport in `typing_extensions` for Python prior to 3.12). There's been a lot
of churn in this area with pytype, but recent versions of pytype and PyCharm
recognize this, and e.g. have `mercurial.node.hex()` defined as:
from typing_extensions import Buffer
def hex(data: Buffer, sep: str | bytes = ..., bytes_per_sep: int = ...) -> bytes
This covers `bytes`, `bytearray`, and `memoryview` by default. Both of the C
functions here use `y#` to parse the arguments, which means the arg is a
byte-like object[2], so the args would appear to be better typed as `Buffer`.
However, pytype has a bug that prevents using this from `typing_extensions`[3],
and mypy complained `Unsupported left operand type for + ("memoryview")` in the
pure module on line 37 (meaning it's only a subset of `Buffer`). So hold off on
changing any of that for now.
[1] https://peps.python.org/pep-0688/#no-special-meaning-for-bytes
[2] https://docs.python.org/3/glossary.html#term-bytes-like-object
[3] https://github.com/google/pytype/issues/1772
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Fri, 04 Oct 2024 23:21:41 -0400 |
parents | 2d51b0cf707c |
children |
comparison
equal
deleted
inserted
replaced
51937:936f85b243a8 | 51938:fa7059f031a9 |
---|---|
68 policy, | 68 policy, |
69 pycompat, | 69 pycompat, |
70 typelib, | 70 typelib, |
71 urllibcompat, | 71 urllibcompat, |
72 ) | 72 ) |
73 from .interfaces import ( | |
74 modules as intmod, | |
75 ) | |
73 from .utils import ( | 76 from .utils import ( |
74 compression, | 77 compression, |
75 hashutil, | 78 hashutil, |
76 procutil, | 79 procutil, |
77 stringutil, | 80 stringutil, |
85 Optional, | 88 Optional, |
86 Tuple, | 89 Tuple, |
87 ] | 90 ] |
88 | 91 |
89 | 92 |
90 base85 = policy.importmod('base85') | 93 base85: intmod.Base85 = policy.importmod('base85') |
91 osutil = policy.importmod('osutil') | 94 osutil = policy.importmod('osutil') |
92 | 95 |
93 b85decode = base85.b85decode | 96 b85decode = base85.b85decode |
94 b85encode = base85.b85encode | 97 b85encode = base85.b85encode |
95 | 98 |