inspect: Fix getcallargs() to raise correct TypeError

... for missing keyword-only arguments. Patch by Jeremiah Lowin.
Closes #20816.
diff --git a/Lib/inspect.py b/Lib/inspect.py
index 05d67fc..fdb5e2a 100644
--- a/Lib/inspect.py
+++ b/Lib/inspect.py
@@ -1210,7 +1210,7 @@
     missing = 0
     for kwarg in kwonlyargs:
         if kwarg not in arg2value:
-            if kwarg in kwonlydefaults:
+            if kwonlydefaults and kwarg in kwonlydefaults:
                 arg2value[kwarg] = kwonlydefaults[kwarg]
             else:
                 missing += 1
diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py
index 95b8877..b943530 100644
--- a/Lib/test/test_inspect.py
+++ b/Lib/test/test_inspect.py
@@ -1208,6 +1208,14 @@
         self.assertEqualException(f3, '1, 2')
         self.assertEqualException(f3, '1, 2, a=1, b=2')
 
+        # issue #20816: getcallargs() fails to iterate over non-existent
+        # kwonlydefaults and raises a wrong TypeError
+        def f5(*, a): pass
+        with self.assertRaisesRegex(TypeError,
+                                    'missing 1 required keyword-only'):
+            inspect.getcallargs(f5)
+
+
 class TestGetcallargsMethods(TestGetcallargsFunctions):
 
     def setUp(self):
diff --git a/Misc/NEWS b/Misc/NEWS
index c8384f9..fa774ba 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -113,6 +113,9 @@
 
 - Issue #20378: Improve repr of inspect.Signature and inspect.Parameter.
 
+- Issue #20816: Fix inspect.getcallargs() to raise correct TypeError for
+  missing keyword-only arguments. Patch by Jeremiah Lowin.
+
 Documentation
 -------------