为什么不在这个函数中使用更少的代码行(urllib.urlopen)?

时间:2017-09-10 20:56:25

标签: python python-3.x

我正在为初学者的级别python编写一个教程,我发现我可以用少一行代码获得相同的结果,而且我不知道为什么教师(他是一个15年以上的专业人士选择使用额外的线/变量。我的假设是它与urllib库的低级使用有关,和/或它可能是编程最佳实践,但我希望有人能够告诉我原因。

有问题的功能是:

from urllib.request import urlopen

def load_page(url: str):
    response = urlopen(url)
    html = response.read().decode('utf')
    return html

正如我所知,这会返回请求的实际HTML。但是当我调试并且只是检查每个函数执行/返回的内容时,我发现通过删除"响应"我可以获得相同的结果(请求的HTML)。完全变量:

def load_page(url: str):
    html = urlopen(url).read().decode('utf')
    return html

您是否有理由首先将urlopen(url)分配给response,而不是直接在read()上运行decode()urlopen(url)

2 个答案:

答案 0 :(得分:4)

类似函数应该“做一件事”,关于每行代码都可以这样说。有一个类似的问题(关于减少Software Engineering: "Is fewer lines of code always better?"上的行数的更广泛的概念)

这是一个发出请求的操作,一个操作来获取请求的内容。

from urllib.request import urlopen

def load_page(url: str):
    response = urlopen(url)               # make request
    html = response.read().decode('utf')  # get contents
    return html

这有许多优点:

  • 调试:如果失败,您就会知道失败的位置(就行号而言)。在执行urlopendecode
  • 时是否失败了
  • 扩展代码:您还想检查响应的statusheader?简单,只需访问response.statusresponse.headers
  • 可读性:一行中的操作/调用越多,就越难立即了解该行正在做什么。

但是在这种情况下,在返回行中执行read().decode(...)是“可接受的”:

from urllib.request import urlopen

def load_page(url: str):
    response = urlopen(url)               # make request
    return response.read().decode('utf')  # get contents and return

答案 1 :(得分:2)

MXeifert的答案非常好。我会特别关注一点:

  

可读性

如上所述,单行上的更多操作/调用使其更难理解。 这不仅仅是因为它更加压缩,而且还因为它限制了您描述情况的能力。这与使用错误的变量名非常相似,请考虑以下内容:

x = ShowPanel()
print(x)

在这种情况下,ShowPanel()似乎不是一个很棒的函数名。但是如果我们无法更改该名称,那么我们应该使用我们的变量来使代码更有效地描述自己。我们不需要这样做,我们可以这样做:

print(ShowPanel())

但我仍然不知道将会打印什么。怎么样:

isPanelVisible = ShowPanel()
print(isPanelVisible)

更好。

在你的例子中也是如此

html = response.read().decode('utf')
return html

VS

return response.read().decode('utf')

第一个非常清楚地表明正在返回html。第二个,虽然仍然没有过于复杂,但并不那么明确。