Подтвердить что ты не робот

Как чистить до 80- char ширину с длинными строками?

Я пытаюсь сохранить мой код до 80 символов или меньше в наши дни, поскольку, по-моему, он выглядит более эстетически приятным, по большей части. Иногда, однако, код заканчивается хуже, если мне приходится помещать разрывы строк в странные места.

Одна вещь, которую я не выяснил, как справиться очень красиво, но длинная строка. Например:

#0.........1........2........3........4.........5.........6.........7.........8xxxxxxxxx9xxxxxx
def foo():
    if conditional():
        logger.info("<Conditional meaning> happened, so we're not setting up the interface.")
        return

    #.....

Это закончилось! Помещение на следующую строку также не поможет:

#0.........1........2........3........4.........5.........6.........7.........8xxxxxxxxx9xxxxxx
def foo():
    if conditional():
        logger.info(
            "<Conditional meaning> happened, so we're not setting up the interface.")
        return

    #.....

Я мог бы использовать разрывы строк, но это выглядит ужасно:

#0.........1........2........3........4.........5.........6.........7.........8
def foo():
    if conditional():
        logger.info(
            "<Conditional meaning> happened, so we're not setting \
up the interface.")
        return

    #.....

Что делать? Сокращение строки является одним из вариантов, но я не хочу, чтобы на читаемость моих сообщений влияло что-то столь же произвольное, как и количество уровней отступов, которые код имел в этой точке.

4b9b3361

Ответ 1

Вы можете разбить строку на две части:

def foo():
    if conditional():
        logger.info("<Conditional meaning> happened, so we're not "
                    "setting up the interface.")

Несколько последовательных строк внутри одного выражения автоматически объединяются в один, во время компиляции:

>>> def foo():
...     if conditional():
...         logger.info("<Conditional meaning> happened, so we're not "
...                     "setting up the interface.")
... 
>>> import dis
>>> dis.dis(foo)
  2           0 LOAD_GLOBAL              0 (conditional)
              3 CALL_FUNCTION            0
              6 POP_JUMP_IF_FALSE       25

  3           9 LOAD_GLOBAL              1 (logger)
             12 LOAD_ATTR                2 (info)
             15 LOAD_CONST               1 ("<Conditional meaning> happened, so we're not setting up the interface.")
             18 CALL_FUNCTION            1
             21 POP_TOP             
             22 JUMP_FORWARD             0 (to 25)
        >>   25 LOAD_CONST               0 (None)
             28 RETURN_VALUE        

Обратите внимание на LOAD_CONST для строки 3, байт-код для функции содержит одну строку, уже конкатенированную.

Если вы хотите добавить выражение + в выражение, создаются две отдельные константы:

>>> def foo():
...     if conditional():
...         logger.info("<Conditional meaning> happened, so we're not " + 
...                     "setting up the interface.")
... 
>>> dis.dis(foo)
  2           0 LOAD_GLOBAL              0 (conditional)
              3 CALL_FUNCTION            0
              6 POP_JUMP_IF_FALSE       29

  3           9 LOAD_GLOBAL              1 (logger)
             12 LOAD_ATTR                2 (info)
             15 LOAD_CONST               1 ("<Conditional meaning> happened, so we're not ")

  4          18 LOAD_CONST               2 ('setting up the interface.')
             21 BINARY_ADD          
             22 CALL_FUNCTION            1
             25 POP_TOP             
             26 JUMP_FORWARD             0 (to 29)
        >>   29 LOAD_CONST               0 (None)
             32 RETURN_VALUE        

Python выполняет свертывание двоичных операций с константами во время компиляции (поэтому +, *, - и т.д.), в оптимизации подписи для байтового компилятора. Поэтому для определенных конкатенаций строк компилятор также может заменить + конкатенацию строк констант конкатенированным результатом. См. peephole.c, для последовательностей (включая строки) эта оптимизация применяется только в том случае, если результат ограничен 20 элементами (символами) или меньше.