PEP8 и длинные имена методов из импортированных модулей - PullRequest
0 голосов
/ 19 декабря 2018

Не могу найти вопрос по этому вопросу, но у меня возникают проблемы с поддержкой 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

Есть предложения?

Ответы [ 4 ]

0 голосов
/ 19 декабря 2018

Несколько опций:

  • определяет псевдоним, как предложено Джона Бишопом
  • , код рефакторинга и функция make, которая возвращает список
  • , рефакторинг кода для уменьшенияуровень отступа

Таким образом, вы можете заменить

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))
0 голосов
/ 19 декабря 2018

Да, просто вставьте несколько разрывов строк:

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.Но, в конце концов, просто делай то, что тебе / твоим командам нравится больше всего.

0 голосов
/ 19 декабря 2018

Вы можете сами дать длинным именам методов короткое имя:

import package

short_method = package.ungodly_ridiculous_long_name_for_a_method
short_class = package.another_ungodly_unnecessarily_long_name_for_a_class
0 голосов
/ 19 декабря 2018

Вы можете разорвать черту между скобками без каких-либо побочных эффектов.Фактически, официальные документы 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

Затем используйте этот псевдоним, где это необходимо.

...