简单而复杂的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 Literal

import 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_property
    def with_raw_response(self) -> CompletionsWithRawResponse:
        return CompletionsWithRawResponse(self)

    @cached_property
    def with_streaming_response(self) -> CompletionsWithStreamingResponse:
        return CompletionsWithStreamingResponse(self)

    '''
    @overload 是来自 typing 模块的装饰器,用于定义单个函数或方法的多个签名。它用于指示静态类型检查器create方法在不同情况下具有多个重载变体。
    方法的实际实现将跟在重载的变体后面,提供了处理不同类型输入的逻辑。
    参数列表中的 * 符号用于表示位置参数的结束和关键字参数的开始。这意味着在 * 后声明的任何参数在调用函数时必须作为关键字参数提供。
    '''
    @overload
    def 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代码与聊天模型进行交互,创建和获取聊天对话的完成。代码支持同步和异步请求,并提供了丰富的参数配置选项,以适应不同的使用场景和需求。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ROS中的栅格地图

目录 一、ROS中栅格地图格式 二、C节点发布地图 2.1 发布者发布地图的C实现 三、python节点发布地图 一、ROS中栅格地图格式 机器人导航所使用的地图数据,就是ROS导航软件包里的map_server 节点,在话题/map中发布的消息数据,消息类型是na…

智能锁也能用上GPT技术了?大扭力电机更配中国门?这家公司再次引领行业

智能锁也能用上GPT技术了?小小智能锁电机,竟然能拉动2.5吨SUV? 今日,中国智能锁领军品牌德施曼在北京举办「2024德施曼创新技术预沟通会」,德施曼技术研发中心总监桑胜伟揭秘了两项行业突破性技术——GPTfinger及龙霆…

vulnhub pWnOS v2.0通关

知识点总结: 1.通过模块来寻找漏洞 2.msf查找漏洞 3.通过网站源代码,查看模块信息 环境准备 攻击机:kali2023 靶机:pWnOS v2.0 安装地址:pWnOS: 2.0 (Pre-Release) ~ VulnHub 在安装网址中看到,该靶…

Deferred library xxx was not loaded

Deferred 延迟修饰词作用下的文件库尚未完成载入

Mysql的MHA

目录 一、MHA概念 1.1 MHA 的组成 1.2 MAH特性 1.3 MHA原理 1.4当主挂了以后会给哪个从服务器? 二、搭建MysqlMHA 2.1实验思路 2.2实验准备 2.3服务搭建 1. 关闭防火墙和selinux 2、修改 master(192.168.91.103)、Slave1&#xff0…

vue3鼠标向下滑动,导航条改变背景颜色和logo的封装

代码中使用了element-plus组件&#xff0c;需先安装 向下滑动前 向下滑动后&#xff08;改变了logo 字体 背景颜色&#xff09; <script lang"ts" setup> import router from /router; import { ArrowDown } from element-plus/icons-vue import { ref, …

课程15 光在晶体中的传播(三)(视频P53-55)

旋光与菲涅尔棱镜 旋光现象 说明从石英晶片出射的&#xff0c;依然是线偏振光&#xff0c;其偏振面却发生了旋转。 左旋石英与右旋石英 ![左旋石英与右旋石英![](https://img-blog.csdnimg.cn/direct/6ead0356c3c740169ba6e723863b743b.png) 旋光异构体 右旋石英表现出φR &a…

基于单片机30mv和300v量程的电压表仿真设计

**单片机设计介绍&#xff0c;基于单片机30mv和300v量程的电压表仿真设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机30mV和300V量程的电压表仿真设计&#xff0c;是一个旨在通过单片机实现宽量程电压测量和显示的综合性项目…

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之RTE模块配置详解(上)

RTE模块配置详解 - 上 一、RTE模块配置实操1.1 打开RTE模块1.2 RTE模块错误消除在这里插入图片描述 这里我们利用工具的自动处理功能。二、Configurator工具Validation总结本节我们就手把手详解RTE配置实现,其实也没有什么过多的操作。。。这个模块更多是工具自动处理的。 一、…

python当中的复数到底有什么用

复数看起来很简单&#xff0c;就是一个数加另外一个数&#xff0c;然后带有J的就是复数。 复数在 Python 中的内部类型是 complex。Python 提供了对复数的内置支持&#xff0c;因此可以直接进行复数的相关计算。复数由实部和虚部构成&#xff0c;可以使用 "j" 或 &qu…

golang语言系列:Authentication、OAuth、JWT 认证策略

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 golang语言系列 文章&#xff0c;主要对编程通用技能 Authentication、OAuth、JWT 认证策略 进行学习 1.Basic Authentication认证 每个请求都需要将 用户名密码 进行base64编码后&#xff0c;放在请求头的Aut…

Scikit-Learn K均值聚类

Scikit-Learn K均值聚类 1、K均值聚类1.1、K均值聚类及原理1.2、K均值聚类的优缺点 2、Scikit-Learn K均值聚类2.1、Scikit-Learn K均值聚类API2.2、K均值聚类案例 1、K均值聚类 K-均值&#xff08;K-Means&#xff09;是一种聚类算法&#xff0c;属于无监督学习。K-Means在机器…

python使用subprocess模拟输入adb命令

如何在Python中执行ADB命令 1. 简介 ADB&#xff08;Android Debug Bridge&#xff09;是Android开发工具包&#xff08;SDK&#xff09;提供的一个命令行工具&#xff0c;用于与Android设备进行通信和调试。在Python中&#xff0c;我们可以通过调用系统命令来执行ADB命令。本…

vue项目视频播放ckplayer使用

ckplayer 官方网址&#xff0c;点击访问 1&#xff0c;打开网页后能看到这里&#xff0c;我现在使用的是最新 X3版手册 2&#xff0c;这个ckplayer不是npm 插件&#xff0c;要下载安装包解压到项目里面使用 安装包网址 通过gitee下载 3&#xff0c;解析安装包到项目中 publ…

ChatGPT会取代Salesforce顾问吗?

当ChatGPT问世时&#xff0c;许多Salesforce顾问很乐意使用该工具完成日常任务。然而&#xff0c;许多专业人士仍未使用过该工具或发现它的多种功能。Salesforce顾问负责处理复杂的项目、兼顾客户需求&#xff0c;并在不断发展的生态系统中通过各种云服务保持领先地位。因此&am…

【图论】【拓扑排序】1857. 有向图中最大颜色值

本文涉及的知识点 图论 拓扑排序 LeetCode1857. 有向图中最大颜色值 给你一个 有向图 &#xff0c;它含有 n 个节点和 m 条边。节点编号从 0 到 n - 1 。 给你一个字符串 colors &#xff0c;其中 colors[i] 是小写英文字母&#xff0c;表示图中第 i 个节点的 颜色 &#xf…

【深耕 Python】Data Science with Python 数据科学(7)书352页练习题

写在前面 关于数据科学环境的建立&#xff0c;可以参考我的博客&#xff1a; 【深耕 Python】Data Science with Python 数据科学&#xff08;1&#xff09;环境搭建 往期数据科学博文&#xff1a; 【深耕 Python】Data Science with Python 数据科学&#xff08;2&#xf…

鸿蒙实战开发-如何实现多设备自适应服务卡片

​介绍 本示例展示Js工程中服务卡片的布局和使用&#xff0c;其中卡片内容显示使用了一次开发&#xff0c;多端部署的能力实现多设备自适应。用到了卡片扩展模块接口&#xff0c;ohos.app.form.FormExtensionAbility 。 卡片信息和状态等相关类型和枚举接口&#xff0c;ohos.…

避雷!新增5本SCI被标记On Hold!1区、CCF推荐上榜

毕业推荐 SSCI • 社科类&#xff0c;分区稳步上升&#xff08;最快13天录用&#xff09; IEEE&#xff1a; • 计算机类&#xff0c;1区(TOP)&#xff0c;CCF推荐 SCIE • 计算机工程类&#xff0c;CCF推荐&#xff08;最快16天录用&#xff09; 期刊动态 科睿唯安新增5…

再谈数据中心网络传输

我在 大历史下的 pacing 中误会程序员了&#xff0c;程序员的路子是正确的(虽然并不指网络方面)。本文接着扯网络&#xff0c;从系统程序员熟悉的开始&#xff1a; 当 cpu 过多时&#xff0c;把大的 spinlock 拆成 percpu lock&#xff1b;使用 hash 时&#xff0c;倾向于 per…