Pythonic代码风格

时间:2014-06-06 18:27:38

标签: python coding-style readability pep8

我是一名业余程序员,在我的大学为一个研究项目写一些python。我需要我的代码对于那些可能在我之后工作的人来说非常易读,因此我试图遵循PEP 8.但是我遇到了规则冲突。违规行是一长串for循环和if语句之后的字典定义。问题是约定使得任何行都不应超过79个字符,但是行连续应该从它们开始的位置缩进。我看到了逻辑上可以做的三种选择,但我不确定什么是最好的。

选项1:保留违规行太长

def getIndexedData(directory):                                                 |
    ...                                                                        |
    ...                                                                        |
    ...                                                                        |
                        # construct dictionary of images with peak locations   |
                        peaks[image] = {                                       |
                            'Xpixel': [float(x) for x in step[17][10][0].text.s|plit(' ')],
                            'Ypixel': [float(x) for x in step[17][10][1].text.s|plit(' ')]}
    return peaks                                                               |

选项2:unindent续行

def getIndexedData(directory):                                                 |
    ...                                                                        |
    ...                                                                        |
    ...                                                                        |
                        # construct dictionary of images with peak locations   |
                        peaks[image] = {                                       |
                'Xpixel': [float(x) for x in step[17][10][0].text.split(' ')], |
                'Ypixel': [float(x) for x in step[17][10][1].text.split(' ')]} |
    return peaks                                                               |

选项3:在某处拆分定义(不确定在哪里)

def getIndexedData(directory):                                                 |
    ...                                                                        |
    ...                                                                        |
    ...                                                                        |
                        # construct dictionary of images with peak locations   |
                        peaks[image] = {                                       |
                            'Xpixel':                                          |
                           [float(x) for x in step[17][10][0].text.split(' ')],|
                            'Ypixel':                                          |
                           [float(x) for x in step[17][10][1].text.split(' ')]}|
    return peaks                                                               |

我也对任何其他建议持开放态度:)

谢谢,

〜亚伦

3 个答案:

答案 0 :(得分:2)

来自PEP 8的几个相关片段添加了我的斜体。

  

风格指南是关于一致性的。与此风格指南保持一致   很重要项目的一致性更为重要。   一个模块或功能的一致性是最重要的。

     

但最重要的是:知道何时不一致 - 有时是   风格指南不适用。如有疑问,请使用您的最佳判断。   查看其他示例并确定最佳效果。并且不要犹豫   问!

     

... 可以将标称线长从80增加到100   字符(有效地将最大长度增加到99   如果评论和文档字符串仍然被包装,则字符)   72个字符。

答案 1 :(得分:2)

当它们短而甜时,功能最佳。我的意思是他们应该在可能的情况下有一个非常明确和简单的目的。如果一个函数具有多个级别的限定,那么该函数试图做太多的信号。它的某些部分可能会被重构为自身的功能。

拥有“小”功能的一个优点是它使代码更容易理解。它还使代码更容易进行单元测试。最后,它有助于将代码保持在79列PEP8样式限制之下。

但是,您可以使用另一个将代码保持在79列限制内的技巧是使用临时变量:

def getIndexedData(directory):                                                 
    ...                                                                        
    ...                                                                        
    ...                                                                        
                        # construct dictionary of images with peak locations
                        texts = [text.split(' ') for text in step[17][10][:2]]
                        x, y = [map(float, text) for text in texts]
                        peaks[image] = {'Xpixel': x, 'Ypixel': y}
    return peaks   

答案 2 :(得分:0)

尝试减少嵌套for循环和if语句的数量。使用函数,生成器或过滤器来实现此目的。如果您显示更多代码,我们可以提供帮助。 您还可以将列表生成拆分为单独的行:

xpixel = step[17][10][0].text.split(' ')
ypixel = step[17][10][1].text.split(' ')
peaks[image] = {
    'Xpixel': map(float, xpixel),
    'Ypixel': map(float, ypixel),
}

您还可以编写转换函数:

def str_to_floats(text):
  return [float(x) for x in text.split()]

...

peaks[image] = {
    'Xpixel': str_to_floats(step[17][10][0].text),
    'Ypixel': str_to_floats(step[17][10][1].text),
}

顺便说一下。 step[17][10][0].text对我来说很奇怪。在您的示例中,只有选项1对我来说是可读的。