Curious2learn
Curious2learn

Reputation: 33648

Python code formatting

In response to another question of mine, someone suggested that I avoid long lines in the code and to use PEP-8 rules when writing Python code. One of the PEP-8 rules suggested avoiding lines which are longer than 80 characters. I changed a lot of my code to comply with this requirement without any problems. However, changing the following line in the manner shown below breaks the code. Any ideas why? Does it have to do with the fact that what follows return command has to be in a single line?

The line longer that 80 characters:

    def __str__(self):
    return "Car Type \n"+"mpg: %.1f \n" % self.mpg + "hp: %.2f \n" %(self.hp) + "pc: %i \n" %self.pc + "unit cost: $%.2f \n" %(self.cost) + "price: $%.2f "%(self.price)

The line changed by using Enter key and Spaces as necessary:

    def __str__(self):
    return "Car Type \n"+"mpg: %.1f \n" % self.mpg + 
                   "hp: %.2f \n" %(self.hp) + "pc: %i \n" %self.pc +
                   "unit cost: $%.2f \n" %(self.cost) + "price: $%.2f "%(self.price)

Upvotes: 4

Views: 1989

Answers (4)

unutbu
unutbu

Reputation: 880657

A multiline string would be more readable:

def __str__(self):
    return '''\
Car Type
mpg: %.1f
hp: %.2f 
pc: %i 
unit cost: $%.2f
price: $%.2f'''% (self.mpg,self.hp,self.pc,self.cost,self.price)

To maintain visually meaningful indentation levels, use textwrap.dedent:

import textwrap
def __str__(self):
    return textwrap.dedent('''\
        Car Type
        mpg: %.1f
        hp: %.2f
        pc: %i
        unit cost: $%.2f
        price: $%.2f'''% (self.mpg,self.hp,self.pc,self.cost,self.price))

Upvotes: 13

FMc
FMc

Reputation: 42421

It require a little extra setup, but a data-driven approach (with a good dose of vertical alignment) is easy to grok and modify as a project evolves. And it indirectly eliminates the problem of long lines of code.

def __str__(self):
    dd = (
        ("Car Type     %s",    ''),
        ("  mpg:       %.1f",  self.mpg),
        ("  hp:        %.2f",  self.hp),
        ("  pc:        %i",    self.pc),
        ("  unit cost: $%.2f", self.cost),
        ("  price:     $%.2f", self.price),
    )

    fmt = ''.join("%s\n" % t[0] for t in dd)
    return fmt % tuple(t[1] for t in dd)

Upvotes: 3

Daniel Stutzbach
Daniel Stutzbach

Reputation: 76745

You can solve the problem by putting the expression in parenthesis:

def __str__(self):
    return ("Car Type \n"+"mpg: %.1f \n" % self.mpg + 
            "hp: %.2f \n" %(self.hp) + "pc: %i \n" %self.pc +
            "unit cost: $%.2f \n" %(self.cost) + "price: $%.2f "%(self.price))

However, I'd consider writing it more like this: (code untested)

def __str__(self):
    return """\
Car Type 
mpg: %(mpg).1f 
hp: %(hp).2f
pc: %(pc)i 
unit cost: $%(cost).2f 
price: $%(price).2f """ % self.__dict__

Upvotes: 6

Mark Rushakoff
Mark Rushakoff

Reputation: 258398

Python doesn't let you end a line inside an expression like that; the simplest workaround is to end the line with a backslash.

def __str__(self):
    return "Car Type \n"+"mpg: %.1f \n" % self.mpg + \
           "hp: %.2f \n" %(self.hp) + "pc: %i \n" %self.pc + \
           "unit cost: $%.2f \n" %(self.cost) + "price: $%.2f "%(self.price)

In this case, the backslash must be the last character on the line. Essentially, it means "ignore the fact that there's a newline here". Or in other words, you're escaping the newline, since it would normally be a significant break.

You can escape an otherwise significant newline at any time with a backslash. It would be silly, but you could even do

def foo():
  return \
   1

so that foo() would return 1. If you didn't have the backslash there, the 1 by itself would cause a syntax error.

Upvotes: 4

Related Questions