gh-110558: Enable ruff's pyupgrade rules when running on Argument Clinic (#110603)

diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 59fe1c3..8bc0d44 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -7,7 +7,7 @@
         args: [--exit-non-zero-on-fix]
         files: ^Lib/test/
       - id: ruff
-        name: Run Ruff on Tools/clinic/
+        name: Run Ruff on Argument Clinic
         args: [--exit-non-zero-on-fix, --config=Tools/clinic/.ruff.toml]
         files: ^Tools/clinic/|Lib/test/test_clinic.py
 
diff --git a/Lib/test/test_clinic.py b/Lib/test/test_clinic.py
index 4a5f472..627a329 100644
--- a/Lib/test/test_clinic.py
+++ b/Lib/test/test_clinic.py
@@ -2398,7 +2398,7 @@ def expect_failure(self, *args):
     def test_external(self):
         CLINIC_TEST = 'clinic.test.c'
         source = support.findfile(CLINIC_TEST)
-        with open(source, 'r', encoding='utf-8') as f:
+        with open(source, encoding='utf-8') as f:
             orig_contents = f.read()
 
         # Run clinic CLI and verify that it does not complain.
@@ -2406,7 +2406,7 @@ def test_external(self):
         out = self.expect_success("-f", "-o", TESTFN, source)
         self.assertEqual(out, "")
 
-        with open(TESTFN, 'r', encoding='utf-8') as f:
+        with open(TESTFN, encoding='utf-8') as f:
             new_contents = f.read()
 
         self.assertEqual(new_contents, orig_contents)
@@ -2466,7 +2466,7 @@ def test_cli_force(self):
                 "/*[clinic end generated code: "
                 "output=c16447c01510dfb3 input=9543a8d2da235301]*/\n"
             )
-            with open(fn, 'r', encoding='utf-8') as f:
+            with open(fn, encoding='utf-8') as f:
                 generated = f.read()
             self.assertTrue(generated.endswith(checksum),
                             (generated, checksum))
diff --git a/Tools/clinic/.ruff.toml b/Tools/clinic/.ruff.toml
index 3bc9d90..cbb3a9a 100644
--- a/Tools/clinic/.ruff.toml
+++ b/Tools/clinic/.ruff.toml
@@ -2,9 +2,24 @@
 fix = true
 select = [
     "F",  # Enable all pyflakes rules
+    "UP",  # Enable all pyupgrade rules by default
     "RUF100",  # Ban unused `# noqa` comments
     "PGH004",  # Ban blanket `# noqa` comments (only ignore specific error codes)
 ]
+ignore = [
+    # Unnecessary parentheses to functools.lru_cache: just leads to unnecessary churn.
+    # https://github.com/python/cpython/pull/104684#discussion_r1199653347.
+    "UP011",
+    # Use format specifiers instead of %-style formatting.
+    # Doesn't always make code more readable.
+    "UP031",
+    # Use f-strings instead of format specifiers.
+    # Doesn't always make code more readable.
+    "UP032",
+    # Use PEP-604 unions rather than tuples for isinstance() checks.
+    # Makes code slower and more verbose. https://github.com/astral-sh/ruff/issues/7871.
+    "UP038",
+]
 unfixable = [
     # The autofixes sometimes do the wrong things for these;
     # it's better to have to manually look at the code and see how it needs fixing
diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py
index 0f26350..1bcc855 100755
--- a/Tools/clinic/clinic.py
+++ b/Tools/clinic/clinic.py
@@ -2423,7 +2423,7 @@ def dump(self) -> str:
 
 def write_file(filename: str, new_contents: str) -> None:
     try:
-        with open(filename, 'r', encoding="utf-8") as fp:
+        with open(filename, encoding="utf-8") as fp:
             old_contents = fp.read()
 
         if old_contents == new_contents: