Лучший стиль Python для сложных однострочников - PullRequest
13 голосов
/ 23 августа 2011

Я недавно написал довольно некрасиво выглядящий однострочный текст, и мне было интересно, лучше ли в стиле 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]

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

Ответы [ 6 ]

19 голосов
/ 23 августа 2011

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

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

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

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

(Теперь, углубившись в царство пониженных голосов ...)

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

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

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

3 голосов
/ 23 августа 2011

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

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

def getlink(url):
    line425 = urllib.urlopen(url).readlines()[425]
    return line425.split('"')[7]
2 голосов
/ 23 августа 2011

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

Вот как я это прочитал:

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

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

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

Однако версия Шона Чина даже легче читать.

2 голосов
/ 23 августа 2011

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

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

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

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

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

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

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

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