Fix typos in docs, comments and test assert messages (#14872)

diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst
index 02a5500..eb0bcf4 100644
--- a/Doc/library/ctypes.rst
+++ b/Doc/library/ctypes.rst
@@ -1175,7 +1175,7 @@
 doesn't *copy* the sub-object, instead it retrieves a wrapper object accessing
 the root-object's underlying buffer.
 
-Another example that may behave different from what one would expect is this::
+Another example that may behave differently from what one would expect is this::
 
    >>> s = c_char_p()
    >>> s.value = b"abc def ghi"
diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py
index d7a4af8..cbbb106 100644
--- a/Lib/asyncio/unix_events.py
+++ b/Lib/asyncio/unix_events.py
@@ -1243,7 +1243,7 @@
     It doesn't require subscription on POSIX signal
     but a thread creation is not free.
 
-    The watcher has O(1) complexity, its perfomance doesn't depend
+    The watcher has O(1) complexity, its performance doesn't depend
     on amount of spawn processes.
     """
 
diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py
index 2264efe..75d7975 100644
--- a/Lib/collections/__init__.py
+++ b/Lib/collections/__init__.py
@@ -440,7 +440,7 @@
         '__slots__': (),
         '_fields': field_names,
         '_field_defaults': field_defaults,
-        # alternate spelling for backward compatiblity
+        # alternate spelling for backward compatibility
         '_fields_defaults': field_defaults,
         '__new__': __new__,
         '_make': _make,
diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py
index 5e57e20..f778a27 100644
--- a/Lib/dataclasses.py
+++ b/Lib/dataclasses.py
@@ -1189,7 +1189,7 @@
             raise TypeError(f'Invalid field: {item!r}')
 
         if not isinstance(name, str) or not name.isidentifier():
-            raise TypeError(f'Field names must be valid identifers: {name!r}')
+            raise TypeError(f'Field names must be valid identifiers: {name!r}')
         if keyword.iskeyword(name):
             raise TypeError(f'Field names must not be keywords: {name!r}')
         if name in seen:
diff --git a/Lib/email/headerregistry.py b/Lib/email/headerregistry.py
index 452c6ad..8d1a202 100644
--- a/Lib/email/headerregistry.py
+++ b/Lib/email/headerregistry.py
@@ -245,7 +245,7 @@
         the header name and the ': ' separator.
 
         """
-        # At some point we need to put fws here iif it was in the source.
+        # At some point we need to put fws here if it was in the source.
         header = parser.Header([
             parser.HeaderLabel([
                 parser.ValueTerminal(self.name, 'header-name'),
diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py
index 1bafc24..5aac048 100644
--- a/Lib/importlib/_bootstrap_external.py
+++ b/Lib/importlib/_bootstrap_external.py
@@ -261,7 +261,7 @@
 #     Python 3.7a2  3391 (update GET_AITER #31709)
 #     Python 3.7a4  3392 (PEP 552: Deterministic pycs #31650)
 #     Python 3.7b1  3393 (remove STORE_ANNOTATION opcode #32550)
-#     Python 3.7b5  3394 (restored docstring as the firts stmt in the body;
+#     Python 3.7b5  3394 (restored docstring as the first stmt in the body;
 #                         this might affected the first line number #32911)
 #     Python 3.8a1  3400 (move frame block handling to compiler #17611)
 #     Python 3.8a1  3401 (add END_ASYNC_FOR #33041)
diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py
index 4bf42e0..9efb3d9 100644
--- a/Lib/test/support/__init__.py
+++ b/Lib/test/support/__init__.py
@@ -2978,7 +2978,7 @@
     if sys.platform.startswith(('linux', 'freebsd')):
         try:
             names = os.listdir("/proc/self/fd")
-            # Substract one because listdir() opens internally a file
+            # Subtract one because listdir() internally opens a file
             # descriptor to list the content of the /proc/self/fd/ directory.
             return len(names) - 1
         except FileNotFoundError:
diff --git a/Lib/test/test_dataclasses.py b/Lib/test/test_dataclasses.py
index 53e8443..ea42904 100755
--- a/Lib/test/test_dataclasses.py
+++ b/Lib/test/test_dataclasses.py
@@ -3043,11 +3043,11 @@
     def test_non_identifier_field_names(self):
         for field in ['()', 'x,y', '*', '2@3', '', 'little johnny tables']:
             with self.subTest(field=field):
-                with self.assertRaisesRegex(TypeError, 'must be valid identifers'):
+                with self.assertRaisesRegex(TypeError, 'must be valid identifiers'):
                     make_dataclass('C', ['a', field])
-                with self.assertRaisesRegex(TypeError, 'must be valid identifers'):
+                with self.assertRaisesRegex(TypeError, 'must be valid identifiers'):
                     make_dataclass('C', [field])
-                with self.assertRaisesRegex(TypeError, 'must be valid identifers'):
+                with self.assertRaisesRegex(TypeError, 'must be valid identifiers'):
                     make_dataclass('C', [field, 'a'])
 
     def test_underscore_field_names(self):
diff --git a/Lib/test/test_eintr.py b/Lib/test/test_eintr.py
index f61efa3..a5f8f64 100644
--- a/Lib/test/test_eintr.py
+++ b/Lib/test/test_eintr.py
@@ -22,7 +22,7 @@
             print()
             print("--- run eintr_tester.py ---", flush=True)
             # In verbose mode, the child process inherit stdout and stdout,
-            # to see output in realtime and reduce the risk of loosing output.
+            # to see output in realtime and reduce the risk of losing output.
             args = [sys.executable, "-E", "-X", "faulthandler", *args]
             proc = subprocess.run(args)
             print(f"--- eintr_tester.py completed: "
diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py
index c9e6e7d..fb76144 100644
--- a/Lib/test/test_fstring.py
+++ b/Lib/test/test_fstring.py
@@ -1161,7 +1161,7 @@
 
         # These next lines contains tabs.  Backslash escapes don't
         # work in f-strings.
-        # patchcheck doens't like these tabs.  So the only way to test
+        # patchcheck doesn't like these tabs.  So the only way to test
         # this will be to dynamically created and exec the f-strings.  But
         # that's such a hassle I'll save it for another day.  For now, convert
         # the tabs to spaces just to shut up patchcheck.
diff --git a/Lib/test/test_importlib/test_main.py b/Lib/test/test_importlib/test_main.py
index 844ed26..5e2cb26 100644
--- a/Lib/test/test_importlib/test_main.py
+++ b/Lib/test/test_importlib/test_main.py
@@ -32,7 +32,7 @@
 class ImportTests(fixtures.DistInfoPkg, unittest.TestCase):
     def test_import_nonexistent_module(self):
         # Ensure that the MetadataPathFinder does not crash an import of a
-        # non-existant module.
+        # nonexistent module.
         with self.assertRaises(ImportError):
             importlib.import_module('does_not_exist')
 
diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py
index 393cdaf..567a5c6 100644
--- a/Lib/test/test_math.py
+++ b/Lib/test/test_math.py
@@ -1875,7 +1875,7 @@
     def testPerm(self):
         perm = math.perm
         factorial = math.factorial
-        # Test if factorial defintion is satisfied
+        # Test if factorial definition is satisfied
         for n in range(100):
             for k in range(n + 1):
                 self.assertEqual(perm(n, k),
@@ -1939,7 +1939,7 @@
     def testComb(self):
         comb = math.comb
         factorial = math.factorial
-        # Test if factorial defintion is satisfied
+        # Test if factorial definition is satisfied
         for n in range(100):
             for k in range(n + 1):
                 self.assertEqual(comb(n, k), factorial(n)
diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py
index ff1ddca..899ca10 100644
--- a/Lib/test/test_random.py
+++ b/Lib/test/test_random.py
@@ -228,7 +228,7 @@
             choices([], cum_weights=[], k=5)
 
     def test_choices_subnormal(self):
-        # Subnormal weights would occassionally trigger an IndexError
+        # Subnormal weights would occasionally trigger an IndexError
         # in choices() when the value returned by random() was large
         # enough to make `random() * total` round up to the total.
         # See https://bugs.python.org/msg275594 for more detail.
diff --git a/Misc/NEWS.d/3.5.2rc1.rst b/Misc/NEWS.d/3.5.2rc1.rst
index 3036625..d891fa0 100644
--- a/Misc/NEWS.d/3.5.2rc1.rst
+++ b/Misc/NEWS.d/3.5.2rc1.rst
@@ -2005,7 +2005,7 @@
 .. nonce: 102DA-
 .. section: Build
 
-Avoid error about nonexistant fileblocks.o file by using a lower-level check
+Avoid error about nonexistent fileblocks.o file by using a lower-level check
 for st_blocks in struct stat.
 
 ..
diff --git a/Misc/NEWS.d/3.6.0a1.rst b/Misc/NEWS.d/3.6.0a1.rst
index dc08e42..3fa356c 100644
--- a/Misc/NEWS.d/3.6.0a1.rst
+++ b/Misc/NEWS.d/3.6.0a1.rst
@@ -3694,7 +3694,7 @@
 .. nonce: 102DA-
 .. section: Build
 
-Avoid error about nonexistant fileblocks.o file by using a lower-level check
+Avoid error about nonexistent fileblocks.o file by using a lower-level check
 for st_blocks in struct stat.
 
 ..
diff --git a/Misc/NEWS.d/3.6.3rc1.rst b/Misc/NEWS.d/3.6.3rc1.rst
index 7594360..4dc2eef 100644
--- a/Misc/NEWS.d/3.6.3rc1.rst
+++ b/Misc/NEWS.d/3.6.3rc1.rst
@@ -877,7 +877,7 @@
 '<<run-module>>', '<<check-module>>', and '<<zoom-height>>'.  Any (global)
 customizations made before 3.6.3 will not affect their keyset-specific
 customization after 3.6.3. and vice versa.
-Inital patch by Charles Wohlganger.
+Initial patch by Charles Wohlganger.
 
 ..
 
diff --git a/Misc/NEWS.d/3.8.0a1.rst b/Misc/NEWS.d/3.8.0a1.rst
index 84c2a6c..3d37669 100644
--- a/Misc/NEWS.d/3.8.0a1.rst
+++ b/Misc/NEWS.d/3.8.0a1.rst
@@ -1358,7 +1358,7 @@
 .. section: Core and Builtins
 
 The list constructor will pre-size and not over-allocate when the input
-lenght is known.
+length is known.
 
 ..
 
diff --git a/Misc/NEWS.d/next/Build/2019-06-17-09-40-59.bpo-37189.j5ebdT.rst b/Misc/NEWS.d/next/Build/2019-06-17-09-40-59.bpo-37189.j5ebdT.rst
index f11f274..8b3be5e 100644
--- a/Misc/NEWS.d/next/Build/2019-06-17-09-40-59.bpo-37189.j5ebdT.rst
+++ b/Misc/NEWS.d/next/Build/2019-06-17-09-40-59.bpo-37189.j5ebdT.rst
@@ -1,3 +1,3 @@
 Many ``PyRun_XXX()`` functions like :c:func:`PyRun_String` were no longer
 exported in ``libpython38.dll`` by mistake. Export them again to fix the ABI
-compatibiliy.
+compatibility.
diff --git a/Modules/_pickle.c b/Modules/_pickle.c
index 735c13d..054276d 100644
--- a/Modules/_pickle.c
+++ b/Modules/_pickle.c
@@ -2119,7 +2119,7 @@
         /* How many bytes do we need?  There are nbits >> 3 full
          * bytes of data, and nbits & 7 leftover bits.  If there
          * are any leftover bits, then we clearly need another
-         * byte.  Wnat's not so obvious is that we *probably*
+         * byte.  What's not so obvious is that we *probably*
          * need another byte even if there aren't any leftovers:
          * the most-significant bit of the most-significant byte
          * acts like a sign bit, and it's usually got a sense
diff --git a/Modules/_xxtestfuzz/fuzzer.c b/Modules/_xxtestfuzz/fuzzer.c
index 2446e71..dae1eae 100644
--- a/Modules/_xxtestfuzz/fuzzer.c
+++ b/Modules/_xxtestfuzz/fuzzer.c
@@ -210,7 +210,7 @@
 
 /* Some random patterns used to test re.match.
    Be careful not to add catostraphically slow regexes here, we want to
-   excercise the matching code without causing timeouts.*/
+   exercise the matching code without causing timeouts.*/
 static const char* regex_patterns[] = {
     ".", "^", "abc", "abc|def", "^xxx$", "\\b", "()", "[a-zA-Z0-9]",
     "abc+", "[^A-Z]", "[x]", "(?=)", "a{z}", "a+b", "a*?", "a??", "a+?",
diff --git a/Python/initconfig.c b/Python/initconfig.c
index c44ae6b..9247443 100644
--- a/Python/initconfig.c
+++ b/Python/initconfig.c
@@ -300,7 +300,7 @@
 PyWideStringList_Append(PyWideStringList *list, const wchar_t *item)
 {
     if (list->length == PY_SSIZE_T_MAX) {
-        /* lenght+1 would overflow */
+        /* length+1 would overflow */
         return _PyStatus_NO_MEMORY();
     }