On Thu, 14 Apr 2005 02:43:40 -0500, Terry Hancock <[EMAIL PROTECTED]> wrote:
>On Thursday 14 April 2005 02:03 am, Dan wrote: >> If you use triple quotes to define a string, then the newlines are >> implicitly included. This is a very nice feature. But if you're >> inside a function or statement, then you'll want the string to be >> positioned along that indentation. And the consequences of this is >> that the string will include those indentations. >> [...] >> But that's just ugly. > >Yeah, it's definitely a wart. So much so that recent Python >distributions include a function to fix it: > >>>> from textwrap import dedent >>>> string_block = dedent(""" >... This string will have the leading >... spaces removed so that it doesn't >... have to break up the indenting. >... """) >>>> string_block >"\nThis string will have the leading\nspaces removed so that it doesn't\nhave >to break up the indenting.\n" >>>> print string_block > >This string will have the leading >spaces removed so that it doesn't >have to break up the indenting. > I never liked any of the solutions that demand bracketing the string with expression brackets, but I just had an idea ;-) >>> class Dedent(object): ... def __init__(self, **kw): self.kw = kw ... def __add__(self, s): ... lines = s.splitlines()[1:] ... margin = self.kw.get('margin', 0)*' ' ... mnow = min(len(L)-len(L.lstrip()) for L in lines) ... return '\n'.join([line[mnow:] and margin+line[mnow:] or '' for line in lines]) ... ... Normally you wouldn't pass **kw in like this, you'd just write mystring = Dedent()+\ or mystring = Dedent(margin=3)+\ but I wanted to control the print. Note the the first line, unless you escape it (ugly there) is zero length and therefore has zero margin, which subverts the other shifting, so I just drop that line. You have to live with the backslash after the + as payment for preferring not to have parentheses ;-) >>> def foo(**kw): ... mystring = Dedent(**kw)+\ ... """ ... This makes ... for a cleaner isolation ... of the string IMO. ... """ ... return mystring ... >>> print '----\n%s----'%foo() ---- This makes for a cleaner isolation of the string IMO. ---- >>> print '----\n%s----'%foo(margin=3) ---- This makes for a cleaner isolation of the string IMO. ---- Regards, Bengt Richter -- http://mail.python.org/mailman/listinfo/python-list