2010-05-08 148 views
4

爲了迴應我的另一個問題,有人建議我避免在代碼中使用很長的行,並在編寫Python代碼時使用PEP-8規則。 PEP-8規則之一建議避免超過80個字符的行。我改變了很多代碼以符合這個要求,沒有任何問題。但是,按照下面顯示的方式更改以下行將破壞代碼。任何想法爲什麼?是否與return命令後面的內容必須在一行中有關?Python代碼格式化

線長於80個字符:

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) 

線通過使用Enter密鑰和Spaces適當變更:

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) 
+0

首先擺脫字符串連接並使用%s替換,這將大大縮短行。像這樣的東西。 'Car Type \ nmpg:%.1f \ n%d hp:%.2f \ npc:%i \ nunit cost:$%。2f \ nprice:$%。2f'%(self.mpg,self.hp,self .pc,self.cost,self.price),你甚至可以命名替換,使它更清晰你在做什麼。 – 2010-05-08 04:04:00

+1

PEP建議非常差並且過時;將代碼壓縮到79列是一種很好的方法,因爲PEP示例本身可以生動地展現出一些不可讀的代碼。 120列更合理,迫使更少的行被拆分。 80列屏幕*不是一個嚴重的開發環境。 – 2010-05-08 16:53:58

回答

4

Python不讓你最終像的表達式內的線那;最簡單的解決方法是用反斜槓結束該行。

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) 

在這種情況下,反斜線必須是行的最後一個字符。本質上,它意味着「忽略這裏有一個換行符的事實」。換句話說,你正在逃避換行,因爲它通常是一個重大的突破。

你可以在任何時候用反斜槓轉義一個重要的換行符。這將是愚蠢的,但你甚至可以做

def foo(): 
    return \ 
    1 

使foo()將返回1.如果您沒有有沒有反斜槓,1本身導致語法錯誤。

+9

更好的解決方法是在表達式周圍放置括號。 – 2010-05-08 04:04:05

13

多行的字符串將是更具可讀性:

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) 

爲了保持視覺上有意義的縮進層次,使用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)) 
+0

我更喜歡這種方法 – dzen 2010-05-08 09:12:04

+0

這種方法的問題是縮進。沒有長字符串的縮進是很難看的。 – Dingle 2010-05-08 16:52:57

6

你能解決這個問題,通過把括號中的表達式:

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)) 

但是,我會考慮寫它更像這樣的:(未測試的代碼)

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

請注意,有'foo.bar'不等同於'foo .__ dict __ ['bar']'的原因。 – 2010-05-08 05:42:15

+2

@Mike強調「我會考慮」。如果我正在寫'__str__',我可能知道它們是否等價。 – 2010-05-08 05:55:53

+0

'vars(self)'看起來比'self .__ dict__'更清潔(它也是這樣) – jfs 2010-05-08 14:25:48

2

它需要一些額外的設置,但一個數據驅動的方法(垂直排列良好的劑量)很容易神交和修改作爲項目的發展。它間接消除了長行代碼的問題。

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)