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