简单而复杂的Python

Python是一种简单&复杂的编程语言。简单的时候可以到极致:

print('hello world!')

另一方面,Python 也具有许多复杂的语法特性,例如面向对象编程、装饰器、迭代器、生成器等等。这些特性使得 Python 适用于各种不同的编程任务和项目。

当我好奇打开OpenAI的Python源代码时,Python的复杂性被体现的淋漓尽致。拿OpenAI经常被用到的Chat Completion接口实现文件completions.py为例。
太难了

可以从github打开源代码;如果你已经安装了OpenAI的library,那么也可以在本地直接打这个开源文件。

因为整个文件有上千行代码,中间create方法的重载也包含了很多重复的部分,这里只贴出它前边的一部分,注释部分是我自己加的:

'''
__future__ 是一个特殊的模块,用于在当前 Python 解释器中启用或禁用某些功能的特性
在当前模块中启用了 annotations 特性。
在 Python 3.7 之前,类型注解中的类型名称会被当作字符串处理,而不是真正的类型。使用 annotations 特性可以改变这种行为,使得类型注解中的类型名称被解释为真正的类型。
在 Python 3.7 及更高版本中,annotations 特性默认是启用的,因此在大多数情况下不需要显式导入。然而,如果你的代码需要与早期版本的 Python 兼容,或者你想显式表达你在代码中使用类型注解,则可以使用 from __future__ import annotations 来确保类型注解的正确行为。
'''
from __future__ import annotations
from typing import Dict, List, Union, Iterable, Optional, overload
from typing_extensions import Literalimport httpx'''
Python中的相对导入语句。每个 . 代表包层次结构中向上一级。
...用于从当前模块相对于包层次结构至少三级深度处导入名为 _legacy_response 的模块
'''
from ... import _legacy_response
from ..._types import NOT_GIVEN, Body, Query, Headers, NotGiven
from ..._utils import (required_args,maybe_transform,async_maybe_transform,
)
from ..._compat import cached_property
from ..._resource import SyncAPIResource, AsyncAPIResource
from ..._response import to_streamed_response_wrapper, async_to_streamed_response_wrapper
from ..._streaming import Stream, AsyncStream
from ...types.chat import (ChatCompletion,ChatCompletionChunk,ChatCompletionToolParam,ChatCompletionMessageParam,ChatCompletionToolChoiceOptionParam,completion_create_params,
)
from ..._base_client import (make_request_options,
)'''
__all__ 是一个特殊的变量,通常用于模块中,它是一个列表,用于指定在使用 from module_name import * 语句导入时,应该导入的对象的名称
不指定时,将导入模块中所有不以下划线开头的全局对象;它允许模块作者显式地控制在使用 from module_name import * 语句时导入的对象
'''
__all__ = ["Completions", "AsyncCompletions"]class Completions(SyncAPIResource):'''这段代码定义了一个装饰器函数 cached_property。在这个例子中,被装饰的函数 with_raw_response 是一个属性访问器方法,它返回一个 CompletionsWithRawResponse 类型的对象。'''@cached_propertydef with_raw_response(self) -> CompletionsWithRawResponse:return CompletionsWithRawResponse(self)@cached_propertydef with_streaming_response(self) -> CompletionsWithStreamingResponse:return CompletionsWithStreamingResponse(self)'''@overload 是来自 typing 模块的装饰器,用于定义单个函数或方法的多个签名。它用于指示静态类型检查器create方法在不同情况下具有多个重载变体。方法的实际实现将跟在重载的变体后面,提供了处理不同类型输入的逻辑。参数列表中的 * 符号用于表示位置参数的结束和关键字参数的开始。这意味着在 * 后声明的任何参数在调用函数时必须作为关键字参数提供。'''@overloaddef create(self,*,messages: Iterable[ChatCompletionMessageParam],...省略...) -> ChatCompletion:...省略...

另外借助于大语言模型,我们可以对这个文件进行一些分析。比如Kimi:

这个Python文件是一个关于API客户端的代码,主要用于与某个聊天模型(如OpenAI的ChatGPT)进行交互。文件中定义了几个类,每个类都提供了不同的方法来创建和处理聊天对话的完成(completions)。以下是对文件中主要结构和功能的详细分析:

  1. 模块导入

    • 文件开始部分导入了多个模块和类型,包括httpx用于HTTP请求,typingtyping_extensions用于类型注解和重载,以及其他一些自定义模块,如_legacy_response__types_utils_compat_resource_streaming_base_client等。
  2. 类型注解和特殊变量

    • 使用from __future__ import annotations来确保类型注解的正确行为。
    • __all__变量定义了模块级别的公共API,即其他模块可以通过from module_name import *导入的对象名称。
  3. Completions类

    • 这个类继承自SyncAPIResource,提供了同步API请求的方法。
    • 类中定义了with_raw_responsewith_streaming_response属性,它们返回对应的响应处理类实例。
    • create方法是一个重载方法,用于创建聊天对话的模型响应。它接受多个参数,包括消息、模型ID、各种生成参数(如frequency_penaltytemperature等)以及额外的请求参数(如extra_headersextra_query等)。
    • create方法有一个特殊的装饰器@required_args,确保在调用create时必须提供某些参数。
  4. AsyncCompletions类

    • 类似于Completions,但用于异步请求。它继承自AsyncAPIResource
    • 同样提供了with_raw_responsewith_streaming_response属性。
    • create方法的异步版本,使用async def定义,允许异步地创建聊天对话的模型响应。
  5. 响应处理类

    • CompletionsWithRawResponseAsyncCompletionsWithRawResponse类用于处理原始响应。
    • CompletionsWithStreamingResponseAsyncCompletionsWithStreamingResponse类用于处理流式响应。
  6. 其他辅助功能

    • 文件中还包含了一些辅助函数和类,如to_streamed_response_wrapperasync_to_stream_response_wrapper,这些用于将API响应转换为特定格式。

总的来说,这个文件提供了一个API客户端的实现,允许用户通过Python代码与聊天模型进行交互,创建和获取聊天对话的完成。代码支持同步和异步请求,并提供了丰富的参数配置选项,以适应不同的使用场景和需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/294796.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

四信AI视频盒成为时代“卷王”的五大秘诀

2023年12月中央经济工作会议聚焦“发展新质生产力”和 “加快推动人工智能发展”,2024年国务院国资委召开“AI赋能 产业焕新”中央企业人工智能专题推进会,推动中央企业在人工智能领域实现更好发展、发挥更大作用,越来越多的利好人工智能政策…

AR智能眼镜解决方案_MTK平台安卓主板硬件芯片方案开发

AR智能眼镜,是一个可以让现场作业更智能的综合管控设备。采用移动互联网、大数据和云计算等技术,现场数据的采集与分析;同时实现前端现场作业和后端管理的实时连动、信息的同步传输与存储。让前端现场作业更加智能,后端管理更加高…

自己动手写数据库:基于哈希的静态索引设计

数据库设计中有一项至关重要的技术难点,那就是给定特定条件进行查询时,我们需要保证速度尽可能快。假设我们有一个 STUDENT 表,表中包含学生名字,年龄,专业等字段,当我们要查询给定年龄数值的记录&#xff…

2024年MathorCup数学建模思路A题B题C题D题思路分享

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间:2024…

C语言联合体,枚举详解

1. 前言 前边我们已经了解了结构体在C语言当中是如何使用的,今天咱来一起聊一聊联合体与枚举在C语言当中又是如何运用的呢 2. 联合体的了解与运用 2.1 联合体的声明: 相比于结构体来说,联合体最大的区别就在于它是联合体当中所有成员共用一…

vue3+threejs新手从零开发卡牌游戏(十八):己方场上手牌添加画线

手牌上场后,点击己方怪兽区卡牌会跟随鼠标移动画出线条,之后可以通过判断鼠标移动到对方场地的某卡牌进行战斗操作,代码主要改动在game/index.vue文件。 1.添加鼠标移动监听事件(移动端): window.addEven…

Golang 内存管理和垃圾回收底层原理(二)

一、这篇文章我们来聊聊Golang内存管理和垃圾回收,主要注重基本底层原理讲解,进一步实战待后续文章 垃圾回收,无论是Java 还是 Golang,基本的逻辑都是基于 标记-清理 的, 标记是指标记可能需要回收的对象&#xff0c…

泛域名站群,泛域名程序

泛域名站群是一种利用大量类似的泛域名来建立多个网站,并通过这些网站链接到主网站,以提升主网站的排名和流量的策略。泛域名站群通常包含大量的子域名,这些子域名指向不同的页面,但它们的内容大部分是重复或相似的,目…

Linux 系统 docker搭建LNMP环境

1、安装nginx docker pull nginx (默认安装的是最新版本) 2、运行nginx docker run --name nginx -p 80:80 -d nginx:latest 备注:--name nginx 表示容器名为 nginx -d 表示后台运行 -p 80:80 表示把本地80端口绑定到Nginx服务端的 80端口 nginx:lates…

机器学习模型及其使用方法——《机器学习图解》

本书教你两件事——机器学习模型及其使用方法 机器学习模型有不同的类型,有些返回确定性的答案,例如是或否,而另一些返回概率性的答案。有些以问题的形式呈现;其他则使用假设性表达。这些类型的一个共同点是它们都返回一个答案或…

怎么在UE游戏中加入原生振动效果

我是做振动触感的。人类的五感“视听嗅味触”,其中的“触”就是触觉,是指皮肤、毛发与物体接触时的感觉。触感可以带来更加逼真的沉浸式体验。但也许过于司空见惯,也是习以为常,很多人漠视了触感的价值。大家对触感的认知还远远不…

Maplesoft Maple 2024(数学科学计算)mac/win

Maplesoft Maple是一款强大的数学计算软件,提供了丰富的功能和工具,用于数学建模、符号计算、数据可视化等领域的数学分析和解决方案。 Mac版软件下载:Maplesoft Maple 2024 for mac激活版 WIn版软件下载:Maplesoft Maple 2024特别…

深入理解HDFS工作原理:大数据存储和容错性机制解析

** 引言: 关联阅读博客文章:深入解析大数据体系中的ETL工作原理及常见组件 关联阅读博客文章:探讨在大数据体系中API的通信机制与工作原理 关联阅读博客文章:深入理解 Hadoop 上的 Hive 查询执行流程 关联阅读博客文章&#xff…

数据结构二叉树顺序存储——堆

堆 1.堆的概念2.堆的实现 (建小堆为例)2.1 初始化和销毁2.2 判空2.3 获得堆顶元素和堆的大小2.4 插入2.5 删除 3.堆的构建(建小堆为例) 1.堆的概念 将若干数据或元素按照完全二叉树的存储方式顺序存储到一个一维数组中&#xff0…

深度学习armv8/armv9 cache的原理

快速链接: 【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈 本文转自 周贺贺,baron,代码改变世界ctw,Arm精选, 资深安全架构专家,11年手机安全/SOC底层安全开发经验。擅长trustzon…

【pytest、playwright】多账号同时操作

目录 方案实现思路: 方案一: 方案二: 方案实现思路: 依照上图所见,就知道,一个账号是pytest-playwright默认的环境,一个是 账号登录的环境 方案一: 直接上代码: imp…

Node.js-------初识Node.js与内置模块

能够知道什么是 Node.js能够知道 Node.js 可以做什么能够说出 Node.js 中的 JavaScript 的组成部分能够使用 fs 模块读写操作文件能够使用 path 模块处理路径能够使用 http 模块写一个基本的 web 服务器 一.初识Node.js 1.浏览器中的 JavaScript 的组成部分 2.Node.js 简介 …

使用Pollard_rho算法分解质因数

分解质因数的朴素算法 最简单的算法即为从 [2, sqrt&#xff08;N&#xff09;] 进行遍历。 vector<int> breakdown(int N) {vector<int> result;for (int i 2; i * i < N; i) {if (N % i 0) { // 如果 i 能够整除 N&#xff0c;说明 i 为 N 的一个质因子。…

iOS苹果签名共享签名是什么以及如何获取?

哈喽&#xff0c;大家好呀&#xff0c;咕噜淼淼又来和大家见面啦&#xff0c;最近有很多朋友都来向我咨询共享签名iOS苹果IPA共享签名是什么&#xff0c;针对这个问题&#xff0c;淼淼来解答一下大家的疑惑并告诉大家iOS苹果ipa共享签名需要如何获取。 现在苹果签名在市场上的…

Autodesk Maya 2025---智能建模与动画创新,重塑创意工作流程

Autodesk Maya 2025是一款顶尖的三维动画软件&#xff0c;广泛应用于影视广告、角色动画、电影特技等领域。新版本在功能上进行了全面升级&#xff0c;新增了对Apple芯片的支持&#xff0c;建模、绑定和角色动画等方面的功能也更加出色。 在功能特色方面&#xff0c;Maya 2025…