gpt4 book ai didi

python - 使用 urllib、urllib2 和 request 避免类似 "Pyramid of Doom"的语法

转载 作者:行者123 更新时间:2023-11-28 20:15:03 27 4
gpt4 key购买 nike

很难为响应编写 Python2 和 Python3 以及 request 依赖代码,因为它们有 urlopen() 函数和 requests.get()函数返回不同的类型:

  • Python2 urllib.request.urlopen() 返回一个 http.client.HTTPResponse
  • Python3 urllib.urlopen(url) 返回一个实例
  • 请求 request.get(url) 返回一个 requests.models.Response

为了同时支持 Python2 和 Python3 以及不想安装 request 依赖项的用户,我尝试了一个看起来像 try-except 的“毁灭金字塔”在导入和 get_content() 函数中:

try: # Try importing requests first.
import requests
except ImportError:
try: # Try importing Python3 urllib
import urllib.request
except AttributeError: # Now importing Python2 urllib
import urllib


def get_content(url):
try: # Using requests.
return requests.get(url).content # Returns requests.models.Response.
except NameError:
try: # Using Python3 urllib.
with urllib.request.urlopen(index_url) as response:
return response.read() # Returns http.client.HTTPResponse.
except AttributeError: # Using Python3 urllib.
return urllib.urlopen(url).read() # Returns an instance.

是否有其他方法可以达到返回读取内容和避免嵌套try-except的相同结果?

最佳答案

使用requests 对您的用户有什么好处?简单地忽略 requests 并支持标准库函数会更容易。这可以通过像这样导入对其余代码透明地完成:

try:
from urllib.request import urlopen
except ImportError:
from urllib2 import urlopen

从那时起,所有 GET 请求都可以使用 urlopen(url) 发出。可以使用 read() 检索返回的数据。

现在,如果您真的想继续requests 支持,您可以像这样将导入代码与get_content() 的定义一起编写:

try:
import requests
get_content = lambda url : requests.get(url).content
except ImportError:
try: # Python 3
from urllib.request import urlopen
except ImportError: # Python2
from urllib2 import urlopen
get_content = lambda url : urlopen(url).read()

关于python - 使用 urllib、urllib2 和 request 避免类似 "Pyramid of Doom"的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47916517/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com