Skip to content

Commit 04d7d4d

Browse files
Daverballdavidism
authored andcommitted
improve typing for _simple_escaping_wrapper
1 parent 910ffff commit 04d7d4d

2 files changed

Lines changed: 26 additions & 29 deletions

File tree

‎CHANGES.rst‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ Version 2.1.3
33

44
Unreleased
55

6+
- Fix static typing for basic ``str`` methods on ``Markup``. :issue:`358`
7+
68

79
Version 2.1.2
810
-------------

‎src/markupsafe/__init__.py‎

Lines changed: 24 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,23 @@ class HasHTML(te.Protocol):
1010
def __html__(self) -> str:
1111
pass
1212

13+
_P = te.ParamSpec("_P")
14+
1315

1416
__version__ = "2.1.3.dev"
1517

1618
_strip_comments_re = re.compile(r"<!--.*?-->", re.DOTALL)
1719
_strip_tags_re = re.compile(r"<.*?>", re.DOTALL)
1820

1921

20-
def _simple_escaping_wrapper(name: str) -> t.Callable[..., "Markup"]:
21-
orig = getattr(str, name)
22-
23-
@functools.wraps(orig)
24-
def wrapped(self: "Markup", *args: t.Any, **kwargs: t.Any) -> "Markup":
25-
args = _escape_argspec(list(args), enumerate(args), self.escape) # type: ignore
22+
def _simple_escaping_wrapper(func: "t.Callable[_P, str]") -> "t.Callable[_P, Markup]":
23+
@functools.wraps(func)
24+
def wrapped(self: "Markup", *args: "_P.args", **kwargs: "_P.kwargs") -> "Markup":
25+
arg_list = _escape_argspec(list(args), enumerate(args), self.escape)
2626
_escape_argspec(kwargs, kwargs.items(), self.escape)
27-
return self.__class__(orig(self, *args, **kwargs))
27+
return self.__class__(func(self, *arg_list, **kwargs)) # type: ignore[arg-type]
2828

29-
return wrapped
29+
return wrapped # type: ignore[return-value]
3030

3131

3232
class Markup(str):
@@ -177,27 +177,22 @@ def escape(cls, s: t.Any) -> "Markup":
177177

178178
return rv
179179

180-
for method in (
181-
"__getitem__",
182-
"capitalize",
183-
"title",
184-
"lower",
185-
"upper",
186-
"replace",
187-
"ljust",
188-
"rjust",
189-
"lstrip",
190-
"rstrip",
191-
"center",
192-
"strip",
193-
"translate",
194-
"expandtabs",
195-
"swapcase",
196-
"zfill",
197-
):
198-
locals()[method] = _simple_escaping_wrapper(method)
199-
200-
del method
180+
__getitem__ = _simple_escaping_wrapper(str.__getitem__)
181+
capitalize = _simple_escaping_wrapper(str.capitalize)
182+
title = _simple_escaping_wrapper(str.title)
183+
lower = _simple_escaping_wrapper(str.lower)
184+
upper = _simple_escaping_wrapper(str.upper)
185+
replace = _simple_escaping_wrapper(str.replace)
186+
ljust = _simple_escaping_wrapper(str.ljust)
187+
rjust = _simple_escaping_wrapper(str.rjust)
188+
lstrip = _simple_escaping_wrapper(str.lstrip)
189+
rstrip = _simple_escaping_wrapper(str.rstrip)
190+
center = _simple_escaping_wrapper(str.center)
191+
strip = _simple_escaping_wrapper(str.strip)
192+
translate = _simple_escaping_wrapper(str.translate)
193+
expandtabs = _simple_escaping_wrapper(str.expandtabs)
194+
swapcase = _simple_escaping_wrapper(str.swapcase)
195+
zfill = _simple_escaping_wrapper(str.zfill)
201196

202197
def partition(self, sep: str) -> t.Tuple["Markup", "Markup", "Markup"]:
203198
l, s, r = super().partition(self.escape(sep))

0 commit comments

Comments
 (0)