【问题标题】:Is there predefined class for URL in Python?Python中是否有预定义的URL类?
【发布时间】:2011-09-04 10:41:52
【问题描述】:

我正在 python-modules、Django、Zope 或 Python 中的任何地方寻找类似 @​​987654321@ 的东西。 我希望它最好从语义原因,因为相关程序的分析结果表明URL在其中起着至关重要的作用。结果是这样的 URL 类在该程序中也将有很大的实际用途。

我当然可以自己编写这样的课程,但我想在开始重新发明轮子之前先看看周围。

我确实看过urllib2urlparseurlparse 基本上具有我需要的功能,但它没有将其封装到像java.net.URL 这样的类中。关于我对程序的分析,它是颠倒的。

我还在SplitResultParseResult 类中查看了urlparse 的源代码。它们具有一些基本功能,可用于子类化。但是我必须将其余的 urlparse 函数重写为子类方法。

我还发现了mxURL - Flexible URL Datatype for Python。它非常接近我真正想要的。只是这对我的目的来说似乎有点过头了。

任何人都可以提出其他选择吗?我应该继续重新发明轮子吗?

我的解决方案:

为了获得我的 URL 类,我基本上做了两件事:

  1. urlparse.ResultMixin 继承。
  2. 定义只调用urlparse.urlparse()并将结果转换为的函数 URL 实例的参数。

【问题讨论】:

  • 你为什么需要一个类?
  • @Cat Plus Plus:为 URL 设置一个类会非常方便。事实上非常方便,Python 标准库中包含一个。
  • @larsmans:实际上,它只不过是一个命名元组。
  • @Cat Plus Plus:您对 URL 类还有什么期望? ;)
  • 我认为拥有一个 URL 类是个好主意。 URL 是一个值对象,与任何其他对象非常相似。也许它比 Python 更像 Java 哲学,但是,例如,从字符串构造一个然后获取方案、主机、路径等是一个非常强大的案例。看起来 urlparse 可以很好地完成这项工作,但不会破坏 Java 类的情况。

标签: python url urlparse


【解决方案1】:

urlparse 确实将 URL 封装到一个名为 ParseResult 的类中,因此可以将其视为这些的工厂函数。直接来自 Python 文档:

>>> urlparse('http://www.cwi.nl:80/%7Eguido/Python.html')
ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html',
            params='', query='', fragment='')

如果您迫切需要一个名为 URL 的类来封装您的 URL,请使用别名 (URL = urlparse.ParseResult) 或创建一个适配器。

【讨论】:

  • ParseResult 被命名为元组。我不知道为什么。我想更改现有的 url,但没有明确的方法可以使用 urllib。
  • @n0nSmoker 现在,将来我们在标准库中有pathlib,它是不可变的。虽然你可以很容易地产生新的Path 以某种方式更改。
【解决方案2】:

您可能需要考虑查看furl,因为它可能会满足您的需求。

【讨论】:

  • 谢谢。我很喜欢!我试试看;-)
  • furl 的缺点是它不能(和 won't)处理 params。但问题是谁需要params
  • @sumid 来自GitHub url 维护者说“如果它们的使用量增加,我会很乐意添加它们(或接受拉取请求)。”如果你需要参数,我相信你可以贡献它! :)
【解决方案3】:

我们在 2018 年的情况:

今天只维护了 furl,但它的主要缺点是它是可变的,这当然不鼓励最佳实践。 (有一个很好的现代参考——pathlib,它由不可变的类组成。)

总体而言,使用一种轻松的 OO 方法来解析和构造 URL 非常棒。

更新

yarl值得一看。

【讨论】:

    【解决方案4】:

    ~在这里聚会晚了 10 年,但今天,pydantic 提供了several URL types,这可能有助于验证、存储和传递 URL;随着type hintsmypy 现在越来越流行,有些人可能会认为这是某种标准。

    【讨论】:

      猜你喜欢
      • 2022-01-08
      • 2013-11-14
      • 2012-08-28
      • 1970-01-01
      • 2010-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-15
      相关资源
      最近更新 更多