我正在为初学者的级别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)
?
答案 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
这有许多优点:
urlopen
或decode
?status
或header
?简单,只需访问response.status
或response.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。第二个,虽然仍然没有过于复杂,但并不那么明确。