来自导入模块的PEP8和较长的方法名称



我似乎找不到问题,但是由于我导入的模块,我遇到了维护PEP8的问题。

我正在使用TextGridTools(TGT)模块来解析TextGrid文件,以注释口语音频文件的格式。问题是它具有可怕的长名,例如get_annotations_between_timepoints

因为我正在使用循环,条件和列表理解的类方法中使用它,所以它已经大大缩进:

def align_intervals(self):
  print('Aligning intervals...')
  brk = self.brk_intervals
  all_atts = self.all_attributes
  word_list = []
    for i in range(len(brk)):
      if i == 0:
        word_list.append([att.get_annotations_between_timepoints(0, brk[0].time) for att in all_atts])
      else:
        word_list.append([att.get_annotations_between_timepoints(brk[i-1].time, brk[i].time) for att in all_atts])
  return word_list

有什么建议?

您可以打破括号之间的界线而不会造成不良影响。实际上,官方的PEP-8文档说了很多:

包裹长行的首选方法是使用python的隐含线延续,括号,支架和支撑。通过在括号中包裹表达式,可以在多条线上折断长线。这些应优先使用后斜线进行线路延续。

def align_intervals(self):
    print('Aligning intervals...')
    brk = self.brk_intervals
    all_atts = self.all_attributes
    word_list = []
    for i in range(len(brk)):
        if i == 0:
            word_list.append([
                att.get_annotations_between_timepoints(
                    0, brk[0].time
                ) for att in all_atts
            ])
        else:
            word_list.append([
                att.get_annotations_between_timepoints(
                    brk[i - 1].time, brk[i].time
                ) for att in all_atts
            ])
    return word_list

一种替代方法是用较短的局部变量吸用长函数:

get_tpts = att.get_annotations_between_timepoints

然后在需要时使用该别名。

您可以自己给长名称一个简短的名称:

import package
short_method = package.ungodly_ridiculous_long_name_for_a_method
short_class = package.another_ungodly_unnecessarily_long_name_for_a_class

是的,只需插入一些线路断裂:

def align_intervals(self):
    print('Aligning intervals...')
    brk = self.brk_intervals
    all_atts = self.all_attributes
    word_list = []
        for i in range(len(brk)):
        if i == 0:
            word_list.append(
                [
                    att.get_annotations_between_timepoints(0, brk[0].time) 
                    for att in all_atts
                ]
            )
      else:
        word_list.append(
            [
                att.get_annotations_between_timepoints(brk[i-1].time, brk[i].time) 
                for att in all_atts
            ]
        )
  return word_list

代码样式没有确切的答案,因为毕竟这是一个主观的事情。Black最近引入了一个非常不错的IMO的代码格式化器。但是最后,只要您/您的团队最喜欢的事情。

几个选项:

  • 定义别名,就像乔纳·毕晓普(Jonah Bishop)的建议一样
  • 重构代码并制作将返回列表的功能
  • 重构代码以降低凹痕水平

因此您可以替换

word_list = []
    for i in range(len(brk)):
        if i == 0:
            word_list.append([
                att.get_annotations_between_timepoints(
                    0, brk[0].time
                ) for att in all_atts
            ])
        else:
            word_list.append([
                att.get_annotations_between_timepoints(
                    brk[i - 1].time, brk[i].time
                ) for att in all_atts
            ])

    def gabt(brk0, brk1, all_atts):
        att_gabt = att.get_annotations_between_timepoints
        return [att_gabt(brk0.time, brk1.time) for att in all_atts]
    word_list = [gabt(0, brk[0].time, all_atts)]
    for brk0, brk1 in zip(brk[:-1], brk[1:]):
        word_list.append(gabt(brk0.time, brk1.time, all_atts))

因为它是在课堂上,因此重构代码可能看起来像这样:

def _gabt(self, brk0, brk1):
    att_gabt = att.get_annotations_between_timepoints
    return [att_gabt(brk0.time, brk1.time) for att in self.all_attributes]
word_list = [self._gabt(0, brk[0].time)]
for brk0, brk1 in zip(brk[:-1], brk[1:]):
    word_list.append(self._gabt(brk0.time, brk1.time))

最新更新