Issue #25523: Correct "a" article to "an" article

This changes the main documentation, doc strings, source code comments, and a
couple error messages in the test suite. In some cases the word was removed
or edited some other way to fix the grammar.
diff --git a/Modules/_ctypes/libffi/src/x86/darwin64.S b/Modules/_ctypes/libffi/src/x86/darwin64.S
index 2f7394e..0c72ed2 100644
--- a/Modules/_ctypes/libffi/src/x86/darwin64.S
+++ b/Modules/_ctypes/libffi/src/x86/darwin64.S
@@ -350,7 +350,7 @@
 	.set	L$set$3,LUW1-LUW0
 	.long	L$set$3
 
-	/* New stack frame based off rbp.  This is a itty bit of unwind
+	/* New stack frame based off rbp.  This is an itty bit of unwind
 	   trickery in that the CFA *has* changed.  There is no easy way
 	   to describe it correctly on entry to the function.  Fortunately,
 	   it doesn't matter too much since at all points we can correctly
diff --git a/Modules/_ctypes/libffi/src/x86/unix64.S b/Modules/_ctypes/libffi/src/x86/unix64.S
index dcd6bc7..45a0ed7 100644
--- a/Modules/_ctypes/libffi/src/x86/unix64.S
+++ b/Modules/_ctypes/libffi/src/x86/unix64.S
@@ -366,7 +366,7 @@
 	.byte	0x4			/* DW_CFA_advance_loc4 */
 	.long	.LUW1-.LUW0
 
-	/* New stack frame based off rbp.  This is a itty bit of unwind
+	/* New stack frame based off rbp.  This is an itty bit of unwind
 	   trickery in that the CFA *has* changed.  There is no easy way
 	   to describe it correctly on entry to the function.  Fortunately,
 	   it doesn't matter too much since at all points we can correctly
diff --git a/Modules/_ctypes/libffi_osx/x86/darwin64.S b/Modules/_ctypes/libffi_osx/x86/darwin64.S
index 165d469..1286d33 100644
--- a/Modules/_ctypes/libffi_osx/x86/darwin64.S
+++ b/Modules/_ctypes/libffi_osx/x86/darwin64.S
@@ -351,7 +351,7 @@
  .set  L$set$3,LUW1-LUW0
  .long L$set$3
 
- /* New stack frame based off rbp.  This is a itty bit of unwind
+ /* New stack frame based off rbp.  This is an itty bit of unwind
     trickery in that the CFA *has* changed.  There is no easy way
     to describe it correctly on entry to the function.  Fortunately,
     it doesn't matter too much since at all points we can correctly
diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c
index d5dde6a..5b0a7be 100644
--- a/Modules/_hashopenssl.c
+++ b/Modules/_hashopenssl.c
@@ -706,7 +706,7 @@
     if (openssl_obj_name == NULL)
         return;
     /* Ignore aliased names, they pollute the list and OpenSSL appears to
-     * have a its own definition of alias as the resulting list still
+     * have its own definition of alias as the resulting list still
      * contains duplicate and alternate names for several algorithms.     */
     if (openssl_obj_name->alias)
         return;
diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c
index 45c31a5..44116d8 100644
--- a/Modules/_io/_iomodule.c
+++ b/Modules/_io/_iomodule.c
@@ -75,7 +75,7 @@
 "Another IOBase subclass, TextIOBase, deals with the encoding and decoding\n"
 "of streams into text. TextIOWrapper, which extends it, is a buffered text\n"
 "interface to a buffered raw stream (`BufferedIOBase`). Finally, StringIO\n"
-"is a in-memory stream for text.\n"
+"is an in-memory stream for text.\n"
 "\n"
 "Argument names are not part of the specification, and only the arguments\n"
 "of open() are intended to be used as keyword arguments.\n"
diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c
index b419275..0c1b13e 100644
--- a/Modules/_io/textio.c
+++ b/Modules/_io/textio.c
@@ -931,8 +931,8 @@
         if (self->encoding == NULL) {
           catch_ImportError:
             /*
-             Importing locale can raise a ImportError because of
-             _functools, and locale.getpreferredencoding can raise a
+             Importing locale can raise an ImportError because of
+             _functools, and locale.getpreferredencoding can raise an
              ImportError if _locale is not available.  These will happen
              during module building.
             */
diff --git a/Modules/_pickle.c b/Modules/_pickle.c
index 830479f..8a98f51 100644
--- a/Modules/_pickle.c
+++ b/Modules/_pickle.c
@@ -4032,7 +4032,7 @@
 
 The *file* argument must have a write() method that accepts a single
 bytes argument. It can thus be a file object opened for binary
-writing, a io.BytesIO instance, or any other custom object that meets
+writing, an io.BytesIO instance, or any other custom object that meets
 this interface.
 
 If *fix_imports* is True and protocol is less than 3, pickle will try
@@ -4042,7 +4042,7 @@
 
 static int
 _pickle_Pickler___init___impl(PicklerObject *self, PyObject *file, PyObject *protocol, int fix_imports)
-/*[clinic end generated code: output=56e229f3b1f4332f input=b8cdeb7e3f5ee674]*/
+/*[clinic end generated code: output=56e229f3b1f4332f input=4faabdbc763c2389]*/
 {
     _Py_IDENTIFIER(persistent_id);
     _Py_IDENTIFIER(dispatch_table);
@@ -6443,7 +6443,7 @@
 The argument *file* must have two methods, a read() method that takes
 an integer argument, and a readline() method that requires no
 arguments.  Both methods should return bytes.  Thus *file* can be a
-binary file object opened for reading, a io.BytesIO object, or any
+binary file object opened for reading, an io.BytesIO object, or any
 other custom object that meets this interface.
 
 Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
@@ -6458,7 +6458,7 @@
 
 static int
 _pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file, int fix_imports, const char *encoding, const char *errors)
-/*[clinic end generated code: output=b9ed1d84d315f3b5 input=30b4dc9e976b890c]*/
+/*[clinic end generated code: output=b9ed1d84d315f3b5 input=04ece661aa884837]*/
 {
     _Py_IDENTIFIER(persistent_load);
 
@@ -6877,7 +6877,7 @@
 
 The *file* argument must have a write() method that accepts a single
 bytes argument.  It can thus be a file object opened for binary
-writing, a io.BytesIO instance, or any other custom object that meets
+writing, an io.BytesIO instance, or any other custom object that meets
 this interface.
 
 If *fix_imports* is True and protocol is less than 3, pickle will try
@@ -6887,7 +6887,7 @@
 
 static PyObject *
 _pickle_dump_impl(PyModuleDef *module, PyObject *obj, PyObject *file, PyObject *protocol, int fix_imports)
-/*[clinic end generated code: output=a606e626d553850d input=e9e5fdd48de92eae]*/
+/*[clinic end generated code: output=a606e626d553850d input=830f8a64cef6f042]*/
 {
     PicklerObject *pickler = _Pickler_New();
 
@@ -6985,7 +6985,7 @@
 The argument *file* must have two methods, a read() method that takes
 an integer argument, and a readline() method that requires no
 arguments.  Both methods should return bytes.  Thus *file* can be a
-binary file object opened for reading, a io.BytesIO object, or any
+binary file object opened for reading, an io.BytesIO object, or any
 other custom object that meets this interface.
 
 Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
@@ -7000,7 +7000,7 @@
 
 static PyObject *
 _pickle_load_impl(PyModuleDef *module, PyObject *file, int fix_imports, const char *encoding, const char *errors)
-/*[clinic end generated code: output=568c61356c172654 input=da97372e38e510a6]*/
+/*[clinic end generated code: output=568c61356c172654 input=2df7c7a1e6742204]*/
 {
     PyObject *result;
     UnpicklerObject *unpickler = _Unpickler_New();
diff --git a/Modules/atexitmodule.c b/Modules/atexitmodule.c
index 9887014..b9c344a 100644
--- a/Modules/atexitmodule.c
+++ b/Modules/atexitmodule.c
@@ -257,7 +257,7 @@
 PyDoc_STRVAR(atexit_unregister__doc__,
 "unregister(func) -> None\n\
 \n\
-Unregister a exit function which was previously registered using\n\
+Unregister an exit function which was previously registered using\n\
 atexit.register\n\
 \n\
     func - function to be unregistered");
diff --git a/Modules/audioop.c b/Modules/audioop.c
index 5efed0c..9a5d8c1 100644
--- a/Modules/audioop.c
+++ b/Modules/audioop.c
@@ -112,7 +112,7 @@
 
 /*
  * linear2ulaw() accepts a 14-bit signed integer and encodes it as u-law data
- * stored in a unsigned char.  This function should only be called with
+ * stored in an unsigned char.  This function should only be called with
  * the data shifted such that it only contains information in the lower
  * 14-bits.
  *
@@ -218,7 +218,7 @@
 
 /*
  * linear2alaw() accepts an 13-bit signed integer and encodes it as A-law data
- * stored in a unsigned char.  This function should only be called with
+ * stored in an unsigned char.  This function should only be called with
  * the data shifted such that it only contains information in the lower
  * 13-bits.
  *
diff --git a/Modules/clinic/_pickle.c.h b/Modules/clinic/_pickle.c.h
index 975298c..c0c54d2 100644
--- a/Modules/clinic/_pickle.c.h
+++ b/Modules/clinic/_pickle.c.h
@@ -77,7 +77,7 @@
 "\n"
 "The *file* argument must have a write() method that accepts a single\n"
 "bytes argument. It can thus be a file object opened for binary\n"
-"writing, a io.BytesIO instance, or any other custom object that meets\n"
+"writing, an io.BytesIO instance, or any other custom object that meets\n"
 "this interface.\n"
 "\n"
 "If *fix_imports* is True and protocol is less than 3, pickle will try\n"
@@ -258,7 +258,7 @@
 "The argument *file* must have two methods, a read() method that takes\n"
 "an integer argument, and a readline() method that requires no\n"
 "arguments.  Both methods should return bytes.  Thus *file* can be a\n"
-"binary file object opened for reading, a io.BytesIO object, or any\n"
+"binary file object opened for reading, an io.BytesIO object, or any\n"
 "other custom object that meets this interface.\n"
 "\n"
 "Optional keyword arguments are *fix_imports*, *encoding* and *errors*,\n"
@@ -366,7 +366,7 @@
 "\n"
 "The *file* argument must have a write() method that accepts a single\n"
 "bytes argument.  It can thus be a file object opened for binary\n"
-"writing, a io.BytesIO instance, or any other custom object that meets\n"
+"writing, an io.BytesIO instance, or any other custom object that meets\n"
 "this interface.\n"
 "\n"
 "If *fix_imports* is True and protocol is less than 3, pickle will try\n"
@@ -459,7 +459,7 @@
 "The argument *file* must have two methods, a read() method that takes\n"
 "an integer argument, and a readline() method that requires no\n"
 "arguments.  Both methods should return bytes.  Thus *file* can be a\n"
-"binary file object opened for reading, a io.BytesIO object, or any\n"
+"binary file object opened for reading, an io.BytesIO object, or any\n"
 "other custom object that meets this interface.\n"
 "\n"
 "Optional keyword arguments are *fix_imports*, *encoding* and *errors*,\n"
@@ -542,4 +542,4 @@
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=3aba79576e240c62 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=1ba210152e2261d8 input=a9049054013a1b77]*/
diff --git a/Modules/expat/pyexpatns.h b/Modules/expat/pyexpatns.h
index 2f2f4f9..999c5c7 100644
--- a/Modules/expat/pyexpatns.h
+++ b/Modules/expat/pyexpatns.h
@@ -21,7 +21,7 @@
  *
  *
  * The Solution:
- * Prefix all a exported symbols with "PyExpat_". This is similar to
+ * Prefix all exported symbols with "PyExpat_". This is similar to
  * what Mozilla does for some common libs:
  * http://lxr.mozilla.org/seamonkey/source/modules/libimg/png/mozpngconf.h#115
  *
diff --git a/Modules/hashlib.h b/Modules/hashlib.h
index 51c68f6..3580453 100644
--- a/Modules/hashlib.h
+++ b/Modules/hashlib.h
@@ -30,7 +30,7 @@
 /*
  * Helper code to synchronize access to the hash object when the GIL is
  * released around a CPU consuming hashlib operation. All code paths that
- * access a mutable part of obj must be enclosed in a ENTER_HASHLIB /
+ * access a mutable part of obj must be enclosed in an ENTER_HASHLIB /
  * LEAVE_HASHLIB block or explicitly acquire and release the lock inside
  * a PY_BEGIN / END_ALLOW_THREADS block if they wish to release the GIL for
  * an operation.
diff --git a/Modules/readline.c b/Modules/readline.c
index ad51349..e9eabf5 100644
--- a/Modules/readline.c
+++ b/Modules/readline.c
@@ -1195,7 +1195,7 @@
         return NULL;
     }
 
-    /* We got an EOF, return a empty string. */
+    /* We got an EOF, return an empty string. */
     if (p == NULL) {
         p = PyMem_RawMalloc(1);
         if (p != NULL)