]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-136066: simplify `platform._platform()` (#136069)
authorBénédikt Tran <10796600+picnixz@users.noreply.github.com>
Sun, 29 Jun 2025 07:56:52 +0000 (09:56 +0200)
committerGitHub <noreply@github.com>
Sun, 29 Jun 2025 07:56:52 +0000 (09:56 +0200)
Lib/platform.py
Lib/test/test_platform.py

index e7f180fc5ac3a33e9f45481753a7f618066dcc72..da15bb4717bb96e26edfa41327e0383c586a0ae0 100644 (file)
@@ -612,6 +612,9 @@ def system_alias(system, release, version):
 
 ### Various internal helpers
 
+# Table for cleaning up characters in filenames.
+_SIMPLE_SUBSTITUTIONS = str.maketrans(r' /\:;"()', r'_-------')
+
 def _platform(*args):
 
     """ Helper to format the platform string in a filename
@@ -621,28 +624,13 @@ def _platform(*args):
     platform = '-'.join(x.strip() for x in filter(len, args))
 
     # Cleanup some possible filename obstacles...
-    platform = platform.replace(' ', '_')
-    platform = platform.replace('/', '-')
-    platform = platform.replace('\\', '-')
-    platform = platform.replace(':', '-')
-    platform = platform.replace(';', '-')
-    platform = platform.replace('"', '-')
-    platform = platform.replace('(', '-')
-    platform = platform.replace(')', '-')
+    platform = platform.translate(_SIMPLE_SUBSTITUTIONS)
 
     # No need to report 'unknown' information...
     platform = platform.replace('unknown', '')
 
     # Fold '--'s and remove trailing '-'
-    while True:
-        cleaned = platform.replace('--', '-')
-        if cleaned == platform:
-            break
-        platform = cleaned
-    while platform and platform[-1] == '-':
-        platform = platform[:-1]
-
-    return platform
+    return re.sub(r'-{2,}', '-', platform).rstrip('-')
 
 def _node(default=''):
 
index 3688cc4267b6b246944ee06c7ca6023a0befc6e3..479649053abc01616d54068c0ee286f1f032b97c 100644 (file)
@@ -133,6 +133,22 @@ class PlatformTest(unittest.TestCase):
             for terse in (False, True):
                 res = platform.platform(aliased, terse)
 
+    def test__platform(self):
+        for src, res in [
+            ('foo bar', 'foo_bar'),
+            (
+                '1/2\\3:4;5"6(7)8(7)6"5;4:3\\2/1',
+                '1-2-3-4-5-6-7-8-7-6-5-4-3-2-1'
+            ),
+            ('--', ''),
+            ('-f', '-f'),
+            ('-foo----', '-foo'),
+            ('--foo---', '-foo'),
+            ('---foo--', '-foo'),
+        ]:
+            with self.subTest(src=src):
+                self.assertEqual(platform._platform(src), res)
+
     def test_system(self):
         res = platform.system()