Skip to content

Commit 9f58d9e

Browse files
[3.12] gh-105578: Add more usage examples to typing.AnyStr docs (GH-107045) (#107503)
gh-105578: Add more usage examples to `typing.AnyStr` docs (GH-107045) ``typing.AnyStr`` has different semantics to ``str | bytes``, which often leads to user confusion (cherry picked from commit f877b32) Co-authored-by: Michael The <[email protected]>
1 parent 831fd19 commit 9f58d9e

File tree

1 file changed

+15
-0
lines changed

1 file changed

+15
-0
lines changed

Doc/library/typing.rst

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -849,6 +849,21 @@ using ``[]``.
849849
concat(b"foo", b"bar") # OK, output has type 'bytes'
850850
concat("foo", b"bar") # Error, cannot mix str and bytes
851851

852+
Note that, despite its name, ``AnyStr`` has nothing to do with the
853+
:class:`Any` type, nor does it mean "any string". In particular, ``AnyStr``
854+
and ``str | bytes`` are different from each other and have different use
855+
cases::
856+
857+
# Invalid use of AnyStr:
858+
# The type variable is used only once in the function signature,
859+
# so cannot be "solved" by the type checker
860+
def greet_bad(cond: bool) -> AnyStr:
861+
return "hi there!" if cond else b"greetings!"
862+
863+
# The better way of annotating this function:
864+
def greet_proper(cond: bool) -> str | bytes:
865+
return "hi there!" if cond else b"greetings!"
866+
852867
.. data:: LiteralString
853868

854869
Special type that includes only literal strings.

0 commit comments

Comments
 (0)