bpo-41477: Make ctypes optional in test_genericalias (GH-21766)

diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py
index 4f3798e..1f24469 100644
--- a/Lib/test/test_genericalias.py
+++ b/Lib/test/test_genericalias.py
@@ -13,7 +13,10 @@
 from dataclasses import Field
 from functools import partial, partialmethod, cached_property
 from mailbox import Mailbox, _PartialFile
-from ctypes import Array, LibraryLoader
+try:
+    import ctypes
+except ImportError:
+    ctypes = None
 from difflib import SequenceMatcher
 from filecmp import dircmp
 from fileinput import FileInput
@@ -46,43 +49,44 @@
     """Test basics."""
 
     def test_subscriptable(self):
-        for t in (type, tuple, list, dict, set, frozenset, enumerate,
-                  defaultdict, deque,
-                  SequenceMatcher,
-                  dircmp,
-                  FileInput,
-                  OrderedDict, Counter, UserDict, UserList,
-                  Pattern, Match,
-                  partial, partialmethod, cached_property,
-                  AbstractContextManager, AbstractAsyncContextManager,
-                  Awaitable, Coroutine,
-                  AsyncIterable, AsyncIterator,
-                  AsyncGenerator, Generator,
-                  Iterable, Iterator,
-                  Reversible,
-                  Container, Collection,
-                  Callable,
-                  Mailbox, _PartialFile,
-                  ContextVar, Token,
-                  Field,
-                  Set, MutableSet,
-                  Mapping, MutableMapping, MappingView,
-                  KeysView, ItemsView, ValuesView,
-                  Sequence, MutableSequence,
-                  MappingProxyType, AsyncGeneratorType,
-                  DirEntry,
-                  chain,
-                  TemporaryDirectory, SpooledTemporaryFile,
-                  Queue, SimpleQueue,
-                  _AssertRaisesContext,
-                  Array, LibraryLoader,
-                  SplitResult, ParseResult,
-                  ValueProxy, ApplyResult,
-                  WeakSet, ReferenceType, ref,
-                  ShareableList, SimpleQueue,
-                  Future, _WorkItem,
-                  Morsel,
-                  ):
+        types = [type, tuple, list, dict, set, frozenset, enumerate,
+                 defaultdict, deque,
+                 SequenceMatcher,
+                 dircmp,
+                 FileInput,
+                 OrderedDict, Counter, UserDict, UserList,
+                 Pattern, Match,
+                 partial, partialmethod, cached_property,
+                 AbstractContextManager, AbstractAsyncContextManager,
+                 Awaitable, Coroutine,
+                 AsyncIterable, AsyncIterator,
+                 AsyncGenerator, Generator,
+                 Iterable, Iterator,
+                 Reversible,
+                 Container, Collection,
+                 Callable,
+                 Mailbox, _PartialFile,
+                 ContextVar, Token,
+                 Field,
+                 Set, MutableSet,
+                 Mapping, MutableMapping, MappingView,
+                 KeysView, ItemsView, ValuesView,
+                 Sequence, MutableSequence,
+                 MappingProxyType, AsyncGeneratorType,
+                 DirEntry,
+                 chain,
+                 TemporaryDirectory, SpooledTemporaryFile,
+                 Queue, SimpleQueue,
+                 _AssertRaisesContext,
+                 SplitResult, ParseResult,
+                 ValueProxy, ApplyResult,
+                 WeakSet, ReferenceType, ref,
+                 ShareableList, SimpleQueue,
+                 Future, _WorkItem,
+                 Morsel]
+        if ctypes is not None:
+            types.extend((ctypes.Array, ctypes.LibraryLoader))
+        for t in types:
             if t is None:
                 continue
             tname = t.__name__