《Python高手之路》——2.6 管理API变化

简介:

本节书摘来自异步社区《Python高手之路》一书中的第2章,第2.6节,作者[法]Julien Danjou(朱利安•丹乔), 王飞龙 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.6 管理API变化

在构造API时很难一蹴而就。API需要不断演化、添加、删除或者修改所提供的功能。

在后面的段落中women将讨论如何管理公共API的变化。公共API是指将应用程序或库暴露给终端用户的API。内部API则有另外的考虑,并且由于它们在内部(也就是说用户不需要直接操作这些API),因而可以任意处理它们:分解、调整或者根据需要任意使用。

这两种API很容易区分。Python的传统是用下划线作为私有API的前缀,如foo是公共API,而_bar是私有的。

在构建API时,最糟糕的事情莫过于API被突然破坏。Linus Torvalds就因对Linux内核公共API破坏的零容忍而闻名。考虑到如此多的人依赖Linux,可以说他的选择是非常明智的。

Unix平台的库管理系统很复杂,它依赖于soname(http://en.wikipedia.org/wiki/Soname )和细粒度的版本标识符。Python中没有这样的系统,也没有对应的转换。因此完全取决于维护者如何选择正确的版本号和策略。但是,关于如何定义自己的库或应用程序的版本,你依然可以将Unix系统作为你的灵感来源。通常,版本号应该反映出API对用户的影响,大部分开发人员通过主版本号的增加来表示此类变化,但这取决于你对版本号管理的方法,你也可以采用增加小版本号的方式。

不管如何决定,最重要的一步就是在修改API时要通过文档对修改进行详细地记录,包括:

  • 记录新的接口;
  • 记录废除的旧的接口;
  • 记录如何升级到新的接口。

旧接口不要立刻删除。实际上,应该尽量长时间地保留旧接口。因为已经明确标识为作废,所以新用户不会去使用它。在维护实在太麻烦时再移除旧接口。API变化的记录见示例2.2.

示例2.2API变化的记录

class Car(object):  
    def turn_left(self):  
        """Turn the car left.  

        .. deprecated:: 1.1  
           Use :func:`turn` instead with the direction argument set to left  
        """  
        self.turn(direction='left')  

    def turn(self, direction):  
        """Turn the car in some direction.  

        :param direction: The direction to turn to.  
        :type direction: str  
        """  
        # Write actual code here instead  
        pass

使用Sphinx标记强调修改是个好主意。在构建文档时,用户应该能清楚地知道某个功能不应该再被使用,并且可以直接访问到新功能,并随之解释如何升级旧代码。这个方法的缺点就是,你不能指望开发人员在升级你的Python包到新版本时会去读你的修改日志或者文档。

Python提供了一个很有意思的名为warnings的模块用来解决这一问题。这一模块允许代码发出不同类型的警告信息,如PendingDeprecationWarning和DeprecationWarning。这些警告能够用来通知开发人员某个正在调用的函数已经废弃或即将废弃。这样,开发人员就能够看到他们正在使用旧接口并且应该相应地进行处理5。

回到之前的例子,我们可以利用它向用户发出警告,如示例2.3所示。

示例2.3 带警告的API变化的记录

import warnings  

class Car(object):  
    def turn_left(self):  
        """Turn the car left.  

        .. deprecated:: 1.1  
           Use :func:`turn` instead with the direction argument set to "left".  
        """  
        warnings.warn("turn_left is deprecated, use turn instead",  
                      DeprecationWarning)  
        self.turn(direction='left')  

    def turn(self, direction):  
        """Turn the car in some direction.  

        :param direction: The direction to turn to.  
        :type direction: str  
        """  
        # Write actual code here instead  
        pass

任何调用了废弃的turn_left函数的代码,都将引发一个警告:

>>> Car().turn_left()  
__main__:8: DeprecationWarning: turn_left is deprecated, use turn instead

注意

  从Python 2.7开始,DeprecationWarning默认将不显示。可以通过在调用python时指定-W all选项来禁用这一过滤器。关于-W的可用值的更多信息可以参考python手册。

让你的代码告诉开发人员他们的程序正在使用某些最终将要停止工作的东西是明智的,因为这其实也可以自动化。当运行他们的测试集合时,开发人员可以在执行python时使用-W error选项,它会将警告转换为异常。这意味着一个废弃的函数每次被调用时都会有一个错误被抛出,这样使用你的库的开发人员就可以很容易知道如何具体修改他们的代码。

示例2.4 运行python -W error

>>> import warnings  
>>> warnings.warn("This is deprecated", DeprecationWarning)  
Traceback (most recent call last):  
  File "<stdin>", line 1, in <module>  
DeprecationWarning: This is deprecated
相关文章
|
1天前
|
JSON 安全 API
如何使用Python开发API接口?
在现代软件开发中,API(应用程序编程接口)用于不同软件组件之间的通信和数据交换,实现系统互操作性。Python因其简单易用和强大功能,成为开发API的热门选择。本文详细介绍了Python开发API的基础知识、优势、实现方式(如Flask和Django框架)、实战示例及注意事项,帮助读者掌握高效、安全的API开发技巧。
15 3
如何使用Python开发API接口?
|
2天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
7 1
|
8天前
|
JSON API 数据格式
如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架
本文介绍了如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架,适合小型项目和微服务。文章从环境准备、创建基本Flask应用、定义资源和路由、请求和响应处理、错误处理等方面进行了详细说明,并提供了示例代码。通过这些步骤,读者可以快速上手构建自己的RESTful API。
20 2
|
1月前
|
存储 JSON API
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(1)
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(1)
39 7
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(1)
|
21天前
|
JSON API 数据格式
使用Python和Flask构建简单的RESTful API
【10月更文挑战第12天】使用Python和Flask构建简单的RESTful API
41 1
|
29天前
|
数据采集 人工智能 自然语言处理
Python实时查询股票API的FinanceAgent框架构建股票(美股/A股/港股)AI Agent
金融领域Finance AI Agents方面的工作,发现很多行业需求和用户输入的 query都是和查询股价/行情/指数/财报汇总/金融理财建议相关。如果需要准确的 金融实时数据就不能只依赖LLM 来生成了。常规的方案包括 RAG (包括调用API )再把对应数据和prompt 一起拼接送给大模型来做文本生成。稳定的一些商业机构的金融数据API基本都是收费的,如果是以科研和demo性质有一些开放爬虫API可以使用。这里主要介绍一下 FinanceAgent,github地址 https://github.com/AI-Hub-Admin/FinanceAgent
|
26天前
|
API 数据库 网络架构
深入浅出:使用Python Flask实现RESTful API
【10月更文挑战第7天】在数字化时代,掌握如何高效构建和部署RESTful API是后端开发者的必备技能。本文将引导你了解如何使用Python Flask框架快速打造一个简单而强大的RESTful服务。从基础环境搭建到API设计原则,再到实际代码示例,我们将一步步揭开Flask框架的神秘面纱,让你轻松上手,并能够自信地处理更复杂的项目。
|
29天前
|
JSON API 数据格式
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)
44 0
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)
|
1月前
|
前端开发 API 开发者
深度剖析:AJAX、Fetch API如何成为Python后端开发者的最佳拍档!
深度剖析:AJAX、Fetch API如何成为Python后端开发者的最佳拍档!
33 4
|
1月前
|
前端开发 JavaScript API
惊呆了!学会AJAX与Fetch API,你的Python Web项目瞬间高大上!
在Web开发领域,AJAX与Fetch API是提升交互体验的关键技术。AJAX(Asynchronous JavaScript and XML)作为异步通信的先驱,通过XMLHttpRequest对象实现了局部页面更新,提升了应用流畅度。Fetch API则以更现代、简洁的方式处理HTTP请求,基于Promises提供了丰富的功能。当与Python Web框架(如Django、Flask)结合时,这两者能显著增强应用的响应速度和用户体验,使项目更加高效、高大上。
47 2