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

Лучший стиль python для сложных однострочных

Недавно я написал довольно уродливый вид на один лайнер и задавался вопросом, лучше ли стиль python разбивать его на несколько строк или оставить его как прокомментированный однострочный. Я смотрел в PEP 8, но ничего не говорил об этом

Это код, который я написал:

def getlink(url):
    return(urllib.urlopen(url).readlines()[425].split('"')[7])
    # Fetch the page at "url", read the 426th line, split it along
    # quotes, and return the 8th quote delimited section

Но было бы что-то вроде этого лучше?

 def getlink(url):
    url_file = urllib.urlopen(url)
    url_data = url_file.readlines()
    line = url_data[425]
    line = line.split('"')
    return line[7]

Или, может быть, что-то среднее?

4b9b3361

Ответ 1

Мое голосование будет основано на удобочитаемости. Я считаю, что ваш однострочный сканер быстрее переваривается, чем многострочный пример.

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

Лично я бы написал, что как:

def getlink(url):
    content = urllib.urlopen(url).readlines()  
    return content[425].split('"')[7]  

(Теперь, вступая в сферу downvote...)

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

Я не говорю, что комментарии - это зло, просто эти подробные комментарии могут негативно повлиять на читаемость. Например. классик: x+=1 # increment x by 1

Естественно, это зависит от цели и аудитории кода.

Ответ 2

Я также считаю выражение urllib.urlopen(url).readlines()[425].split('"')[7] довольно понятным.

Однако я бы предпочел:

def getlink(url):
    line425 = urllib.urlopen(url).readlines()[425]
    return line425.split('"')[7]

Ответ 3

Мне многострочная версия намного лучше. С многострочным кодом вы разбиваете логику и используете переменные для хранения промежуточного вывода. Затем имена переменных позволяют мне прочитать логику и посмотреть, от чего зависит мой вывод. Также вам не нужно писать подробные комментарии в этом случае. Мне легче читать многострочную версию через несколько месяцев, чем читать версии одной строки в таких случаях. Пример, который вы опубликовали, не является сложным, но для сохранения последовательности я бы написал код примера в нескольких строках.

Ответ 4

Многострочная версия передает семантику, которую сложнее понять с помощью однострочного интерфейса.

Вот как я его читаю:

 def getlink(url):
    url_file = ...
    url_data = ...
    line = url_data[425]
    ... = ... .split('"')
    return line[7]

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

  • общие вызовы urlopen() и readlines() (очевидно для функции с именем getlink(url))
  • и более конкретные части (url_data[425] и line[7]).

Тем не менее, версия Shawn Chin еще легче читать.

Ответ 5

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

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

Ответ 6

Многострочная версия - это лучший стиль Python. Легче читать, легче понимать и легче модифицировать.

Это Python - легко, хорошо!:)