On Sun, 06 Dec 2009 22:47:48 -0800, Dr. Phillip M. Feldman wrote: > I wrote a handy-dandy function (see below) called "strip_pairs" for > stripping matching pairs of characters from the beginning and end of a > string. This function works, but I would like to be able to invoke it > as a string method rather than as a function. Is this possible?
Not exactly. You can subclass string and add such a method: class MyString(str): def strip_pairs(self, ...): ... but then you have to convert every string to a MyString before you use it. That way leads to madness. Better to just use a function. Don't worry, you're allowed to mix functional and OO code :) As for the function, I think we can re-write it to be a bit more Pythonic. We start with a helper function. (Since it's a one-liner, that's not strictly necessary.) def bracketed_by(s, open, close): """Return True if string s is bracketed by open and close pairs.""" # I'm too lazy to put proper error handling here... return s.startswith(open) and s.endswith(close) # UNTESTED def strip_pairs(s, open='([{\'"', close=')]}\'"'): if len(open) != len(close): raise ValueError( "'open' and 'close' arguments must be equal length strings.") if not isinstance(s, basestring): # FIX ME: this wrongly fails on UserString arguments. raise TypeError('argument must be a string') pairs = zip(open, close) while any(bracketed_by(s, a, b) for (a,b) in pairs): s = s[1:-1] return s The above is written for simplicity rather than efficiency -- for small strings, say, under a couple of megabytes, it is likely to be faster than a more "clever" algorithm. If you are routinely dealing with strings which are tens of megabytes in size, bracketed by dozens or hundreds of pairs of brackets, then the above may be a little slow. But for small strings, it will probably be faster than a routine which tries to be smarter at avoiding copying strings. -- Steven -- http://mail.python.org/mailman/listinfo/python-list