我似乎找不到问题,但是由于我导入的模块,我遇到了维护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))