]> granicus.if.org Git - python/commitdiff
Patch #536661: Improve performance of splitext. Add test_macpath.
authorMartin v. Löwis <martin@v.loewis.de>
Thu, 12 Dec 2002 20:30:20 +0000 (20:30 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Thu, 12 Dec 2002 20:30:20 +0000 (20:30 +0000)
Lib/macpath.py
Lib/ntpath.py
Lib/posixpath.py
Lib/test/test_macpath.py [new file with mode: 0644]
Lib/test/test_ntpath.py
Lib/test/test_posixpath.py

index f19b4f7652f50387d733654e020d141b967d3d0c..734bae292edce39a5dc30e191e0fe4d83e4fceac 100644 (file)
@@ -62,20 +62,11 @@ def splitext(p):
     pathname component; the root is everything before that.
     It is always true that root + ext == p."""
 
-    root, ext = '', ''
-    for c in p:
-        if c == ':':
-            root, ext = root + ext + c, ''
-        elif c == '.':
-            if ext:
-                root, ext = root + ext, c
-            else:
-                ext = c
-        elif ext:
-            ext = ext + c
-        else:
-            root = root + c
-    return root, ext
+    i = p.rfind('.')
+    if i<=p.rfind(':'):
+        return p, ''
+    else:
+        return p[:i], p[i:]
 
 
 def splitdrive(p):
index 0f1dd4dc608aa2f15fc457cb6ac59d40edbfab6d..4e7bb885a9fddbaf8aa79e27cc8e77a989105df7 100644 (file)
@@ -169,20 +169,12 @@ def splitext(p):
 
     Extension is everything from the last dot to the end.
     Return (root, ext), either part may be empty."""
-    root, ext = '', ''
-    for c in p:
-        if c in ['/','\\']:
-            root, ext = root + ext + c, ''
-        elif c == '.':
-            if ext:
-                root, ext = root + ext, c
-            else:
-                ext = c
-        elif ext:
-            ext = ext + c
-        else:
-            root = root + c
-    return root, ext
+
+    i = p.rfind('.')
+    if i<=max(p.rfind('/'), p.rfind('\\')):
+        return p, ''
+    else:
+        return p[:i], p[i:]
 
 
 # Return the tail (basename) part of a path.
index 6a0640d2fc59c0d0c2a7d531fd29559b5141f6da..4a92f18cb91945b9107abb1636768a7d4c75616a 100644 (file)
@@ -78,20 +78,11 @@ def split(p):
 def splitext(p):
     """Split the extension from a pathname.  Extension is everything from the
     last dot to the end.  Returns "(root, ext)", either part may be empty."""
-    root, ext = '', ''
-    for c in p:
-        if c == '/':
-            root, ext = root + ext + c, ''
-        elif c == '.':
-            if ext:
-                root, ext = root + ext, c
-            else:
-                ext = c
-        elif ext:
-            ext = ext + c
-        else:
-            root = root + c
-    return root, ext
+    i = p.rfind('.')
+    if i<=p.rfind('/'):
+        return p, ''
+    else:
+        return p[:i], p[i:]
 
 
 # Split a pathname into a drive specification and the rest of the
diff --git a/Lib/test/test_macpath.py b/Lib/test/test_macpath.py
new file mode 100644 (file)
index 0000000..67b1bed
--- /dev/null
@@ -0,0 +1,64 @@
+import macpath
+from test import test_support
+import unittest
+
+
+class MacPathTestCase(unittest.TestCase):
+
+    def test_abspath(self):
+        self.assert_(macpath.abspath("xx:yy") == "xx:yy")
+
+    def test_isabs(self):
+        isabs = macpath.isabs
+        self.assert_(isabs("xx:yy"))
+        self.assert_(isabs("xx:yy:"))
+        self.assert_(isabs("xx:"))
+        self.failIf(isabs("foo"))
+        self.failIf(isabs(":foo"))
+        self.failIf(isabs(":foo:bar"))
+        self.failIf(isabs(":foo:bar:"))
+
+
+    def test_commonprefix(self):
+        commonprefix = macpath.commonprefix
+        self.assert_(commonprefix(["home:swenson:spam", "home:swen:spam"])
+                     == "home:swen")
+        self.assert_(commonprefix([":home:swen:spam", ":home:swen:eggs"])
+                     == ":home:swen:")
+        self.assert_(commonprefix([":home:swen:spam", ":home:swen:spam"])
+                     == ":home:swen:spam")
+
+    def test_split(self):
+        split = macpath.split
+        self.assertEquals(split("foo:bar"),
+                          ('foo:', 'bar'))
+        self.assertEquals(split("conky:mountpoint:foo:bar"),
+                          ('conky:mountpoint:foo', 'bar'))
+
+        self.assertEquals(split(":"), ('', ''))
+        self.assertEquals(split(":conky:mountpoint:"),
+                          (':conky:mountpoint', ''))
+
+    def test_splitdrive(self):
+        splitdrive = macpath.splitdrive
+        self.assertEquals(splitdrive("foo:bar"), ('', 'foo:bar'))
+        self.assertEquals(splitdrive(":foo:bar"), ('', ':foo:bar'))
+
+    def test_splitext(self):
+        splitext = macpath.splitext
+        self.assertEquals(splitext(":foo.ext"), (':foo', '.ext'))
+        self.assertEquals(splitext("foo:foo.ext"), ('foo:foo', '.ext'))
+        self.assertEquals(splitext(".ext"), ('', '.ext'))
+        self.assertEquals(splitext("foo.ext:foo"), ('foo.ext:foo', ''))
+        self.assertEquals(splitext(":foo.ext:"), (':foo.ext:', ''))
+        self.assertEquals(splitext(""), ('', ''))
+        self.assertEquals(splitext("foo.bar.ext"), ('foo.bar', '.ext'))
+
+
+def test_main():
+    test_support.run_unittest(MacPathTestCase)
+
+
+if __name__ == "__main__":
+    test_main()
+
index 40d785f04ec54b5433e0e312f2b6ab69078baf9a..2419844e418f43795e04def7f1e8434f16c3d6bd 100644 (file)
@@ -15,6 +15,16 @@ def tester(fn, wantResult):
         print " returned: " + str(gotResult)
         print ""
         errors = errors + 1
+        
+tester('ntpath.splitext("foo.ext")', ('foo', '.ext'))
+tester('ntpath.splitext("/foo/foo.ext")', ('/foo/foo', '.ext'))
+tester('ntpath.splitext(".ext")', ('', '.ext'))
+tester('ntpath.splitext("\\foo.ext\\foo")', ('\\foo.ext\\foo', ''))
+tester('ntpath.splitext("foo.ext\\")', ('foo.ext\\', ''))
+tester('ntpath.splitext("")', ('', ''))
+tester('ntpath.splitext("foo.bar.ext")', ('foo.bar', '.ext'))
+tester('ntpath.splitext("xx/foo.bar.ext")', ('xx/foo.bar', '.ext'))
+tester('ntpath.splitext("xx\\foo.bar.ext")', ('xx\\foo.bar', '.ext'))
 
 tester('ntpath.splitdrive("c:\\foo\\bar")',
        ('c:', '\\foo\\bar'))
index 362483f6db50f2b76e8b5f441554fce52c3f302c..0aaddaf0e66a8bd371a588264f4a449d4e6d2c89 100644 (file)
@@ -21,6 +21,11 @@ tester('posixpath.split("foo")', ('', 'foo'))
 
 tester('posixpath.splitext("foo.ext")', ('foo', '.ext'))
 tester('posixpath.splitext("/foo/foo.ext")', ('/foo/foo', '.ext'))
+tester('posixpath.splitext(".ext")', ('', '.ext'))
+tester('posixpath.splitext("/foo.ext/foo")', ('/foo.ext/foo', ''))
+tester('posixpath.splitext("foo.ext/")', ('foo.ext/', ''))
+tester('posixpath.splitext("")', ('', ''))
+tester('posixpath.splitext("foo.bar.ext")', ('foo.bar', '.ext'))
 
 tester('posixpath.isabs("/")', 1)
 tester('posixpath.isabs("/foo")', 1)