Правильное форматирование кода Python (PEP8) - PullRequest
4 голосов
/ 09 августа 2011

Итак, я только что узнал о "Списке понятий" в python.некоторые из них становятся слишком длинными для одной строки (PEP8), и я пытаюсь найти лучший (наиболее читаемый) способ их устранения.

Я придумал это

questions = [
    (
        q,
        q.vote_set.filter(choice__exact='Y'),
        q.vote_set.filter(choice__exact='N'),
        request.session.get(str(q.id))
    )
    for q in questions
]

но он до сих пор жалуется на пробелы перед ], конкретная ошибка pep8 равна E202

, это в блоке с отступом.

Ответы [ 4 ]

1 голос
/ 09 августа 2011

Я бы, наверное, сделал это так:

questions = [(q, 
              q.vote_set.filter(choice__exact='Y'), 
              q.vote_set.filter(choice__exact='N'), 
              request.session.get(str(q.id)))
                  for q in questions]

Имейте в виду, что PEP8 предназначен для использования вместе с вашим лучшим суждением; они не предназначены для соблюдения абсолютно во всех обстоятельствах. Они также не структурированы так, чтобы всегда иметь смысл, когда несколько правил конфликтуют.

Все в порядке, чтобы намеренно время от времени нарушать правила; подобные шашки предназначены только для того, чтобы вы случайно их не сломали .

Редактировать: Переместить мой комментарий в мой ответ.

Ваш код выглядит слишком похоже на Lisp-подобный язык скобок или C-подобный язык фигурных скобок из-за того, что вы ставите скобки и круглые скобки в отдельных строках.

В Python вы просто используете отступ, чтобы показать то, что вы обычно показываете с помощью скобок / круглых скобок / фигурных скобок в отдельной строке на другом языке. Если вы возьмете свой код и внесете это изменение, оно идентично моей версии.

Правда, не слишком переживайте по поводу проверки PEP. Если вам действительно нравятся лишние пробелы, которые вы получаете, помещая скобки и скобки в отдельные строки, сделайте это. Это не делает его «плохим кодом» и не снижает читаемость.

0 голосов
/ 09 августа 2011

Мне также не удалось воспроизвести ваше предупреждение PEP8 с кодом, который вы показали выше.Возможно, вы могли бы поместить свой точный код в пастинную корзину?

Примеры тестовых примеров для PEP8 (если вы используете опцию --show-pep8) следующие:

Avoid extraneous whitespace in the following situations:

- Immediately inside parentheses, brackets or braces.

- Immediately before a comma, semicolon, or colon.

Okay: spam(ham[1], {eggs: 2})
E201: spam( ham[1], {eggs: 2})
E201: spam(ham[ 1], {eggs: 2})
E201: spam(ham[1], { eggs: 2})
E202: spam(ham[1], {eggs: 2} )
E202: spam(ham[1 ], {eggs: 2})
E202: spam(ham[1], {eggs: 2 })

E203: if x == 4: print x, y; x, y = y , x
E203: if x == 4: print x, y ; x, y = y, x
E203: if x == 4 : print x, y; x, y = y, x

Кроме того,На самом деле я не использовал Textmate, но если вы выполняете проверку на лету, похожую на режим flymake в emacs, то может также случиться так, что pep8 будет вызываться для старой версии файла, и проблема может исчезнуть, еслиВы сохраняете файл.Нам может понадобиться больше информации для дальнейшей отладки.

Что касается форматирования самого понимания списка, вы можете взглянуть на этот другой вопрос SO , а также возьмите из руководства по стилю Google .У меня лично нет проблем с тем, как ты это сделал.Я полагаю, вы могли бы также сделать что-то вроде

def _question_tuple(q):
    return (
        q,
        q.vote_set.filter(choice__exact='Y'),
        q.vote_set.filter(choice__exact='N'),
        request.session.get(str(q.id))
    )

question_tups = [_question_tuple(q) for q in questions]

, но это действительно о том, что будет наиболее читабельным / поддерживаемым, и это на ваше усмотрение.

0 голосов
/ 09 августа 2011

Подумайте над тем, чтобы написать свое утверждение, используя выражение генератора .

questions = ((q,
              q.vote_set.filter(choice__exact='Y'),
              q.vote_set.filter(choice__exact='N'),
              request.session.get(str(q.id)),) 
             for q in questions)

Кроме того, не то, чтобы это "неправильно", но в целом я не рекомендую переопределять объявленные переменные, потому что это можетвызвать путаницу в коде.В этом случае вы меняете экземпляр questions на другой тип.

0 голосов
/ 09 августа 2011

Зависит от инструмента, я думаю.Какой инструмент дает вам E202?Я скопировал вставил и попробовал с этим pep8 инструментом, и он не дал никакой ошибки.Но я специально пробел после questions и получил ошибку.

E202 на ] говорит, что до этого он находит пробел.Убедитесь, что у вас этого нет в коде.Попробуйте закрыть ] вскоре после вопросов.

...