Patch #536661: Improve performance of splitext. Add test_macpath.

This commit is contained in:
Martin v. Löwis 2002-12-12 20:30:20 +00:00
parent 427a290c9a
commit de3337913f
6 changed files with 95 additions and 42 deletions

View File

@ -62,20 +62,11 @@ def splitext(p):
pathname component; the root is everything before that. pathname component; the root is everything before that.
It is always true that root + ext == p.""" It is always true that root + ext == p."""
root, ext = '', '' i = p.rfind('.')
for c in p: if i<=p.rfind(':'):
if c == ':': return p, ''
root, ext = root + ext + c, ''
elif c == '.':
if ext:
root, ext = root + ext, c
else: else:
ext = c return p[:i], p[i:]
elif ext:
ext = ext + c
else:
root = root + c
return root, ext
def splitdrive(p): def splitdrive(p):

View File

@ -169,20 +169,12 @@ def splitext(p):
Extension is everything from the last dot to the end. Extension is everything from the last dot to the end.
Return (root, ext), either part may be empty.""" Return (root, ext), either part may be empty."""
root, ext = '', ''
for c in p: i = p.rfind('.')
if c in ['/','\\']: if i<=max(p.rfind('/'), p.rfind('\\')):
root, ext = root + ext + c, '' return p, ''
elif c == '.':
if ext:
root, ext = root + ext, c
else: else:
ext = c return p[:i], p[i:]
elif ext:
ext = ext + c
else:
root = root + c
return root, ext
# Return the tail (basename) part of a path. # Return the tail (basename) part of a path.

View File

@ -78,20 +78,11 @@ def split(p):
def splitext(p): def splitext(p):
"""Split the extension from a pathname. Extension is everything from the """Split the extension from a pathname. Extension is everything from the
last dot to the end. Returns "(root, ext)", either part may be empty.""" last dot to the end. Returns "(root, ext)", either part may be empty."""
root, ext = '', '' i = p.rfind('.')
for c in p: if i<=p.rfind('/'):
if c == '/': return p, ''
root, ext = root + ext + c, ''
elif c == '.':
if ext:
root, ext = root + ext, c
else: else:
ext = c return p[:i], p[i:]
elif ext:
ext = ext + c
else:
root = root + c
return root, ext
# Split a pathname into a drive specification and the rest of the # Split a pathname into a drive specification and the rest of the

64
Lib/test/test_macpath.py Normal file
View File

@ -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()

View File

@ -16,6 +16,16 @@ def tester(fn, wantResult):
print "" print ""
errors = errors + 1 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")', tester('ntpath.splitdrive("c:\\foo\\bar")',
('c:', '\\foo\\bar')) ('c:', '\\foo\\bar'))
tester('ntpath.splitunc("\\\\conky\\mountpoint\\foo\\bar")', tester('ntpath.splitunc("\\\\conky\\mountpoint\\foo\\bar")',

View File

@ -21,6 +21,11 @@ tester('posixpath.split("foo")', ('', 'foo'))
tester('posixpath.splitext("foo.ext")', ('foo', '.ext')) tester('posixpath.splitext("foo.ext")', ('foo', '.ext'))
tester('posixpath.splitext("/foo/foo.ext")', ('/foo/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("/")', 1)
tester('posixpath.isabs("/foo")', 1) tester('posixpath.isabs("/foo")', 1)