我是一名业余程序员,在我的大学为一个研究项目写一些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 |
我也对任何其他建议持开放态度:)
谢谢,
〜亚伦
答案 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对我来说是可读的。