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 c7a2cf8..06057af 100644
--- a/Lib/inspect.py
+++ b/Lib/inspect.py
@@ -1208,7 +1208,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 5c6ae39..20f7217 100644
--- a/Lib/test/test_inspect.py
+++ b/Lib/test/test_inspect.py
@@ -1206,6 +1206,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 8f55c63..c51ad17 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -83,6 +83,9 @@
 - Issue #19748: On AIX, time.mktime() now raises an OverflowError for year
   outsize range [1902; 2037].
 
+- Issue #20816: Fix inspect.getcallargs() to raise correct TypeError for
+  missing keyword-only arguments. Patch by Jeremiah Lowin.
+
 Documentation
 -------------