Лучший стиль 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]
Или, может быть, что-то среднее?
Ответы
Ответ 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 - легко, хорошо!:)