On 27 August 2011 08:24, Steven D'Aprano <steve+comp.lang.pyt...@pearwood.info> wrote: > Arnaud Delobelle wrote: > >> Hi all, >> >> I'm wondering what advice you have about formatting if statements with >> long conditions (I always format my code to <80 colums) >> >> Here's an example taken from something I'm writing at the moment and >> how I've formatted it: >> >> >> if (isinstance(left, PyCompare) and isinstance(right, PyCompare) >> and left.complist[-1] is right.complist[0]): >> py_and = PyCompare(left.complist + right.complist[1:]) >> else: >> py_and = PyBooleanAnd(left, right) >> >> What would you do? > > I believe that PEP 8 now suggests something like this: > > if ( > isinstance(left, PyCompare) and isinstance(right, PyCompare) > and left.complist[-1] is right.complist[0]): > ) > py_and = PyCompare(left.complist + right.complist[1:] > else: > py_and = PyBooleanAnd(left, right) > > > I consider that hideous and would prefer to write this: > > > if (isinstance(left, PyCompare) and isinstance(right, PyCompare) > and left.complist[-1] is right.complist[0]): > py_and = PyCompare(left.complist + right.complist[1:] > else: > py_and = PyBooleanAnd(left, right) > > > Or even this: > > tmp = ( > isinstance(left, PyCompare) and isinstance(right, PyCompare) > and left.complist[-1] is right.complist[0]) > ) > if tmp: > py_and = PyCompare(left.complist + right.complist[1:] > else: > py_and = PyBooleanAnd(left, right) > > > But perhaps the best solution is to define a helper function: > > def is_next(left, right): > """Returns True if right is the next PyCompare to left.""" > return (isinstance(left, PyCompare) and isinstance(right, PyCompare) > and left.complist[-1] is right.complist[0]) > # PEP 8 version left as an exercise. > > > # later... > if is_next(left, right): > py_and = PyCompare(left.complist + right.complist[1:] > else: > py_and = PyBooleanAnd(left, right) >
Thanks Steven and Hans for you suggestions. For this particular instance I've decided to go for a hybrid approach: * Add two methods to PyCompare: class PyCompare(PyExpr): ... def extends(self, other): if not isinstance(other, PyCompare): return False else: return self.complist[0] == other.complist[-1] def chain(self, other): return PyCompare(self.complist + other.complist[1:]) * Rewrite the if as: if isinstance(right, PyCompare) and right.extends(left): py_and = left.chain(right) else: py_and = PyBooleanAnd(left, right) The additional benefit is to hide the implementation details of PyCompare (I suppose this could illustrate the thread on when to create functions). -- Arnaud -- http://mail.python.org/mailman/listinfo/python-list