Raymond Hettinger wrote: > [Marc-Andre Lemburg] > >>I may be missing something, but why invent yet another parsing >>method - we already have the re module. I'd suggest to >>use it :-) >> >>If re is not fast enough or you want more control over the >>parsing process, you could also have a look at mxTextTools: >> >> http://www.egenix.com/files/python/mxTextTools.html > > > Both are excellent tools. Neither is as lightweight, as trivial to > learn, or as transparently obvious as the proposed s.partition(sep). > The idea is to find a viable replacement for s.find().
Your partition idea could be had with an additional argument to .split() (e.g. keepsep=1); no need to learn a new method. Also, as I understand Terry's request, .find() should be removed in favor of just leaving .index() (which is the identical method without the funny -1 return code logic). So your proposal really doesn't have all that much to do with Terry's request, but is a new and separate proposal (which does have some value in few cases, but not enough to warrant a new method). > Looking at sample code transformations shows that the high-power > mxTextTools and re approaches do not simplify code that currently uses > s.find(). In contrast, the proposed partition() method is a joy to use > and has no surprises. The following code transformation shows > unbeatable simplicity and clarity. > > > --- From CGIHTTPServer.py --------------- > > def run_cgi(self): > """Execute a CGI script.""" > dir, rest = self.cgi_info > i = rest.rfind('?') > if i >= 0: > rest, query = rest[:i], rest[i+1:] > else: > query = '' > i = rest.find('/') > if i >= 0: > script, rest = rest[:i], rest[i:] > else: > script, rest = rest, '' > . . . > > > def run_cgi(self): > """Execute a CGI script.""" > dir, rest = self.cgi_info > rest, _, query = rest.rpartition('?') > script, _, rest = rest.partition('/') Wouldn't this do the same ?! ... rest, query = rest.rsplit('?', maxsplit=1) script, rest = rest.split('/', maxsplit=1) > . . . > > > The new proposal does not help every use case though. In > ConfigParser.py, the problem description reads, "a semi-colon is a > comment delimiter only if it follows a spacing character". This cries > out for a regular expression. In StringIO.py, since the task at hand IS > calculating an index, an indexless higher level construct doesn't help. > However, many of the other s.find() use cases in the library simplify as > readily and directly as the above cgi server example. > > > > Raymond > > > ------------------------------------------------------- > > P.S. FWIW, if you want to experiment with it, here a concrete > implementation of partition() expressed as a function: > > def partition(s, t): > """ Returns a three element tuple, (head, sep, tail) where: > > head + sep + tail == s > t not in head > sep == '' or sep is t > bool(sep) == (t in s) # sep indicates if the string was > found > > >>> s = 'http://www.python.org' > >>> partition(s, '://') > ('http', '://', 'www.python.org') > >>> partition(s, '?') > ('http://www.python.org', '', '') > >>> partition(s, 'http://') > ('', 'http://', 'www.python.org') > >>> partition(s, 'org') > ('http://www.python.', 'org', '') > > """ > if not isinstance(t, basestring) or not t: > raise ValueError('partititon argument must be a non-empty > string') > parts = s.split(t, 1) > if len(parts) == 1: > result = (s, '', '') > else: > result = (parts[0], t, parts[1]) > assert len(result) == 3 > assert ''.join(result) == s > assert result[1] == '' or result[1] is t > assert t not in result[0] > return result > > > import doctest > print doctest.testmod() -- Marc-Andre Lemburg eGenix.com Professional Python Services directly from the Source (#1, Aug 28 2005) >>> Python/Zope Consulting and Support ... http://www.egenix.com/ >>> mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/ >>> mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/ ________________________________________________________________________ ::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,FreeBSD for free ! :::: _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com