]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.11] gh-105578: Add more usage examples to `typing.AnyStr` docs (GH-107045) (#107504)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Mon, 31 Jul 2023 15:33:07 +0000 (08:33 -0700)
committerGitHub <noreply@github.com>
Mon, 31 Jul 2023 15:33:07 +0000 (15:33 +0000)
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 f877b32b879f2076bb1c52826af0c28ebf1aaeed)

Co-authored-by: Michael The <michael-the1@users.noreply.github.com>
Doc/library/typing.rst

index a0766690bad2871bf1e60d49b5bb1cd6aec50c10..b6bb50b65db6207c32ab2acf2d3cec79d5b192a0 100644 (file)
@@ -801,6 +801,21 @@ using ``[]``.
       concat(b"foo", b"bar")  # OK, output has type 'bytes'
       concat("foo", b"bar")   # Error, cannot mix str and bytes
 
+   Note that, despite its name, ``AnyStr`` has nothing to do with the
+   :class:`Any` type, nor does it mean "any string". In particular, ``AnyStr``
+   and ``str | bytes`` are different from each other and have different use
+   cases::
+
+      # Invalid use of AnyStr:
+      # The type variable is used only once in the function signature,
+      # so cannot be "solved" by the type checker
+      def greet_bad(cond: bool) -> AnyStr:
+          return "hi there!" if cond else b"greetings!"
+
+      # The better way of annotating this function:
+      def greet_proper(cond: bool) -> str | bytes:
+          return "hi there!" if cond else b"greetings!"
+
 .. data:: LiteralString
 
    Special type that includes only literal strings.