Я знаю, что я должен держать код Python до 79 строк, но как мне сделать отступы строк? - PullRequest
4 голосов
/ 11 августа 2010

Мне известно, что стандартное соглашение Python для ширины строки составляет 79 символов.Я знаю, что строки можно продолжить несколькими способами, такими как автоматическая конкатенация строк, круглые скобки и обратный слеш.То, что кажется не столь четко определенным, это как точно переполненный текст должен быть отформатирован.Должен ли я подтолкнуть его обратно к столбцу 1?На седло, где начинается оригинальная линия?К началу скобок (если применимо)?Например, скажем, у меня что-то вроде этого:


        self.someLongAttributeName = {'someLongKeyName':'someLongValueName',
                                      'anotherLongKeyName':'anotherLongValueName'}

Предположим, что формат, который я использовал выше, будет соответствовать пределу в 79 символов, верно ли отступ второй строки?

Теперь предположим,первая строка, как показано выше, содержит> 79 символов.Как все должно выглядеть в этом случае?

ПРИМЕЧАНИЕ. Я знаю, что многие люди не согласны с соглашением из 79 символов.Хотя я уважаю, что у каждой стороны есть много плюсов и минусов, эта дискуссия не имеет отношения к моему вопросу.Я прошу , как следовать соглашению, не должен ли я этого делать, поэтому, пожалуйста, не поддерживайте преимущества отказа от него в своем ответе.Благодарю.=)

Ответы [ 7 ]

11 голосов
/ 11 августа 2010

Предположим, что формат, который я использовал выше, соответствовал бы пределу в 79 символов, верно ли отступ второй строки?

Да, именно так PEP 8 показывает это в примерах:

class Rectangle(Blob):

    def __init__(self, width, height,
                 color='black', emphasis=None, highlight=0):
        if width == 0 and height == 0 and \
           color == 'red' and emphasis == 'strong' or \
           highlight > 100:
            raise ValueError("sorry, you lose")
        if width == 0 and height == 0 and (color == 'red' or
                                           emphasis is None):
            raise ValueError("I don't think so -- values are %s, %s" %
                             (width, height))
        Blob.__init__(self, width, height,
                      color, emphasis, highlight)

Но когда открывающая скобка / скобка уже близка к 79-му столбцу, я обычно просто использую это:

Two good reasons to break a particular rule:

(1) When applying the rule would make the code less readable, even for
    someone who is used to reading code that follows the rules.
[...]

И делаю что-то вроде

self.some_long_attribute_name = {
    'someLongKeyName': 'someLongValueName',
    'anotherLongKeyName': 'anotherLongValueName'
}

или

long_object_name.do_something_with_long_name(
    long_expression_returning_is_first_arg,
    long_expression_returning_is_second_arg
)
5 голосов
/ 11 августа 2010

http://www.python.org/dev/peps/pep-0008/ Смотри Maximum Line Length

Ограничить все строки максимум 79 символы.

Есть еще много устройств вокруг не более 80 символов линии; плюс, ограничение окон до 80 символы позволяют иметь несколько окон рядом. упаковка по умолчанию на таких устройствах нарушает визуальную структуру код, усложняя Понимаю. Поэтому, пожалуйста, ограничьте все линии максимум 79 персонажи. Для плавных длинных блоков текста (строки документов или комментарии), ограничение длины до 72 символов рекомендуется.

Предпочтительный способ упаковки линии с помощью подразумеваемой линии Питонов продолжение в скобках, скобки и брекеты. Если необходимо, Вы можете добавить дополнительную пару круглые скобки вокруг выражения, но иногда используя обратную косую черту лучше. Убедитесь, что отступ продолжил линию соответственно. предпочтительное место, чтобы разбить вокруг бинарный оператор после оператора, а не до него. Некоторые примеры:

class Rectangle(Blob):

    def __init__(self, width, height,
                 color='black', emphasis=None, highlight=0):
        if width == 0 and height == 0 and \
           color == 'red' and emphasis == 'strong' or \
           highlight > 100:
            raise ValueError("sorry, you lose")
        if width == 0 and height == 0 and (color == 'red' or
                                           emphasis is None):
            raise ValueError("I don't think so -- values are %s, %s" %
                             (width, height))
        Blob.__init__(self, width, height,
                      color, emphasis, highlight)
3 голосов
/ 11 августа 2010

Даже за пределами Python, я делаю это все время для своего C-кода, чтобы я мог (как говорит PEP) открыть 2-3 файла на мониторе рядом и просмотреть их все.

Оператор обратной косой черты \ работает как оператор продолжения строки в Python, так же как и в C, но я предпочитаю пытаться группировать строки с круглыми скобками () или скобками {} (или скобками [] для списков Python) что бы ни было удобнее. Если я решу, что хочу добавить еще одну строку в середине длинного продолжающегося блока, я не хочу беспокоиться о каких-то глупых «ошибках»: пропущено \ или хуже, некоторое ошибочное пространство после \, аннулирующее продолжение.

Для длинных условий мне нравится делать двойной отступ, поэтому более очевидно, что этот код не является частью нового блока.

if (somethingLong == x or
        somethingElse == y or
        somethingOld == z or
        x < y < z or
        doIt.now()):
    pass
2 голосов
/ 11 августа 2010

В PEP 8 есть пример:

class Rectangle(Blob):

    def __init__(self, width, height,
        # more code
        Blob.__init__(self, width, height,
                      color, emphasis, highlight)

Что, на мой взгляд, говорит о том, что ваш пример верен. Я думаю, что вы должны разбить первую строку примера после открывающей скобки ({), например:

    self.someLongAttributeName = {
                 'someLongKeyName':'someLongValueName',
                 'anotherLongKeyName':'anotherLongValueName'
    }

если это слишком долго. Я не знаю, является ли он «питоническим», но должен быть знаком и читаем.

1 голос
/ 11 августа 2010

Предпочтительным способом переноса длинных строк является использование подразумеваемого продолжения строки Python в скобках, скобках и скобках.При необходимости вы можете добавить дополнительную пару скобок вокруг выражения, но иногда использование обратной косой черты выглядит лучше.Удостоверьтесь, что отступ для продолжения строки соответствует.Предпочтительное место для разбивки двоичного оператора - после оператора, а не перед ним.

0 голосов
/ 11 августа 2010

Хороший трюк также заключается в следующем:

my_long_string="""
This are
many lines of text
"""

a = [a in my_long_string.split() if a]

Некоторые люди предпочитают использовать \ после открытия тройной кавычки, а не фильтровать пустые строки, но я действительно ненавижу этих зверей.

Для вашего конкретного примера я согласен с cji.

0 голосов
/ 11 августа 2010

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

Короткий ответ: PEP8 не описывает, как форматировать литералы объекта, кроме того, что двоеточия должны иметь нулевые пробелы до и один пробел после.

Я делаю их так:

obj = {
     'foo': 1,
     'bar': 2,
     'bas': 3,
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...