首页 > 编程问答 >为什么存在 re._compile?

为什么存在 re._compile?

时间:2024-07-27 05:13:49浏览次数:8  
标签:python python-re

这是 re.compile

>>> import re, inspect
>>> print(inspect.getsource(re.compile))
def compile(pattern, flags=0):
    "Compile a regular expression pattern, returning a Pattern object."
    return _compile(pattern, flags)

它只是用相同的参数调用 re._compile

这有什么意义呢?看起来它只是产生了一个无用的额外堆栈帧,这在Python中相对昂贵。应该会有轻微的性能改进和更简单的回溯,只需将 _compile 的主体直接移动到 compile

这种技术使用额外的函数调用 re.compile -> re._compile 的原因是什么?


虽然乍看之下 re.compile 似乎没什么用,并且只是对 re._compile 的一次调用,但它在 Python 的 re 模块的组织和功能中起着至关重要的作用。以下是它的存在的一些原因:

  1. 抽象 :
  2. re.compile 函数充当用户友好的公共接口,而 re._compile 则被视为内部实现细节。这种分离允许开发人员在将来修改内部机制(包括 _compile 的功能),而不会影响依赖公共 API ( re.compile ) 的用户代码。

  3. 潜在的未来优化 :

  4. re.compile 函数的存在为将来在不破坏与现有用户代码的向后兼容性的情况下引入优化提供了灵活性。例如,开发人员可以实现缓存机制,以便在 re.compile 内部,如果使用相同的模式和标志重复调用,则返回已编译的模式对象,从而节省了昂贵的重新编译步骤。

  5. 保持清晰的公共 API :

  6. Python 的 re 模块包含许多函数,这些函数既供最终用户使用,也供其内部使用。以 _ 为前缀的函数(例如 _compile )被认为是私有的,不应由外部代码直接使用。这种命名约定有助于明确区分哪些函数是公开的一部分,哪些是实现细节,从而降低了用户代码意外依赖于可能发生更改的内部函数的可能性。

  7. 简化测试和调试 :

  8. 通过将 re.compile re._compile 分开,开发人员可以分别测试和调试这两个函数。这有助于隔离错误并确保公共 API 按预期工作,即使底层实现发生更改。

总之,虽然 re.compile 可能看起来像是一个无用的包装器,但它通过引入抽象、潜在的未来优化、维护清晰的公共 API 以及简化测试和调试,在 Python 的 re 模块的组织和可维护性中发挥着至关重要的作用。这种设计模式在软件开发中很常见,它允许灵活性和可维护性,而不会牺牲性能或用户体验。

标签:python,python-re
From: 78799460

相关文章

  • Ebay Python SDK 仅在特定项目类别上返回错误
    我在一个项目中使用ebaySDK一段时间了。最近我尝试导入一些商品,例如手表、手机壳等...并且我使用了eBay自己通过eBay返回的英国商店页面上的类别ID他们的“get_category_suggestions”API端点,但eBay似乎有选择地决定拒绝某些项目并引发服务器错误!为了测试,我做了......
  • 使用特定的Python版本(MacOS)制作virtualenv
    我安装了brew,python3(默认和最新版本)和pip3,pyenv。TensorFlow现在不支持python3.7,所以我听说我应该制作一个独立运行3.6或更低版本的virtualenv。我安装了python3.6.7bypyenvinstall3.6.7但无法制作virtualenv-p3.6.7(mydir)因为3.6.7不在P......
  • 使用Python去除图像中的线条
    我正在尝试使用Python和cv2、numpy、skimage等从黑白图像中删除“阴影线”(如果图像中存在“阴影线”)。本质上,我的图像可以有1或2条曲线,如下例所示。但每条线都有一条1-5像素外的阴影线,需要删除。我怎样才能在Python中做到这一点?原始......
  • Python 和 OpenCV:如何裁剪半成形边界框
    我有一个为无网格表创建网格线的脚本:脚本之前:脚本之后:是否有一种简单的方法,使用OpenCV来裁剪“脚本之后”图像,使其仅包含四边边界框?示例输出:编辑:我目前正在研究一种解决方案,该解决方案可以找到垂直/水平方向的第一条/最后一条......
  • 使用类型提示将 Python 转换为 Cython
    类型提示现在在Python3.5版本中可用。在规范(PEP484)中,目标(和非目标)被明确暴露:#RationaleandGoals此PEP旨在为类型注释提供标准语法,开放Python代码更容易静态分析和重构、潜在的运行时类型检查以及(也许在某些情况下)利用类型信息生成代码。......
  • 在 Python 类型提示中区分 PySpark 和 Pandas DataFrame (PyCharm)
    在PyCharm中,如果使用apyspark.sql.DataFrame代替pandas.DataFrame,类型提示似乎不会触发警告,反之亦然。例如以下代码根本不会生成任何警告:frompyspark.sqlimportDataFrameasSparkDataFramefrompandasimportDataFrameasPandasDataFramedef......
  • 如何在Python中继承类型提示?
    所以我的问题是,当我有一个A类型的类来做事情并且我使用这些函数作为subclass(B)时,它们仍然是类A的类型,并且不接受我的类B对象作为参数或作为函数签名。我的问题简化了:fromtypingimportTypeVar,Generic,CallableT=TypeVar('T'......
  • Python - 如何传递类对象的函数参数类型(打字)
    我想python3.7附带了(不确定),不仅可以将变量名传递给函数,还可以传递变量的类型。我想知道的是是否有可能传递特定类的类型。以同样的方式传递:deffoo_func(i:int)->None:pass如果我有一个类,让我们说:classfoo_class(object):pass我如何转换fo......
  • 使用 Python 构建简单 REST API
    使用Python构建简单RESTAPI1.概述本技术文档旨在指导开发者使用Python框架Flask构建一个基本的RESTAPI。通过学习本指南,您将掌握创建、读取、更新和删除(CRUD)操作的基本知识,并能够使用Python构建自己的API。2.安装依赖首先,您需要确保已安装Python和Flask......
  • Python——Pandas(第二讲)
    文章目录变量类型的转换Pandas支持的数据类型在不同数据类型间转换建立索引新建数据框时建立索引读入数据时建立索引指定某列为索引列将索引还原变量列引用和修改索引引用索引修改索引修改索引名修改索引值更新索引Series的索引和切片DataFrame的索引和切片选择列按......