Issue 22547: Implement informative __repr__ for inspect.BoundArguments
diff --git a/Lib/inspect.py b/Lib/inspect.py
index ef2407c..9290b4b 100644
--- a/Lib/inspect.py
+++ b/Lib/inspect.py
@@ -2460,6 +2460,13 @@
     def __getstate__(self):
         return {'_signature': self._signature, 'arguments': self.arguments}
 
+    def __repr__(self):
+        args = []
+        for arg, value in self.arguments.items():
+            args.append('{}={!r}'.format(arg, value))
+        return '<{} at {:#x} ({})>'.format(self.__class__.__name__,
+                                           id(self), ', '.join(args))
+
 
 class Signature:
     """A Signature object represents the overall signature of a function.
diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py
index bbb7afa..6f813be 100644
--- a/Lib/test/test_inspect.py
+++ b/Lib/test/test_inspect.py
@@ -3149,6 +3149,13 @@
                 ba_pickled = pickle.loads(pickle.dumps(ba, ver))
                 self.assertEqual(ba, ba_pickled)
 
+    def test_signature_bound_arguments_repr(self):
+        def foo(a, b, *, c:1={}, **kw) -> {42:'ham'}: pass
+        sig = inspect.signature(foo)
+        ba = sig.bind(20, 30, z={})
+        self.assertRegex(repr(ba),
+                         r'<BoundArguments at 0x[a-fA-F0-9]+ \(a=20,.*\}\}\)>')
+
 
 class TestSignaturePrivateHelpers(unittest.TestCase):
     def test_signature_get_bound_param(self):
diff --git a/Misc/NEWS b/Misc/NEWS
index b181f76..8414ea8 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -125,6 +125,9 @@
 - Issue 24184: Add AsyncIterator and AsyncIterable ABCs to
   collections.abc.  Contributed by Yury Selivanov.
 
+- Issue 22547: Implement informative __repr__ for inspect.BoundArguments.
+  Contributed by Yury Selivanov.
+
 Tests
 -----