简单而复杂的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.mzph.cn/news/787694.shtml

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

相关文章

手撸一个简易 Grid 拖拽布局

公众号:程序员白特,欢迎一起交流学习~ 以下文章来源于稀土掘金技术社区 ,作者游仙好梦 最近有个需求需要实现自定义首页布局,需要将屏幕按照 6 列 4 行进行等分成多个格子,然后将组件可拖拽对应格子进行渲染展示。 对比…

实验:基于Red Hat Enterprise Linux系统的创建磁盘和磁盘分区(一)

目录 一. 实验目的 二. 实验内容 三. 实验设计描述及实验结果 fdisk [参数] [设备] 1. 为虚拟机添加1块大小为3-5G的硬盘nvme,将该硬盘划分1个主分区和两个逻辑分区分别为600MB。 partprobe [选项] [设备] 2. 将主分区格式化为ext4文件系统并挂载到/自己名字命名…

二百二十九、离线数仓——离线数仓Hive从Kafka、MySQL到ClickHouse的完整开发流程

一、目的 为了整理离线数仓开发的全流程,算是温故知新吧 离线数仓的数据源是Kafka和MySQL数据库,Kafka存业务数据,MySQL存维度数据 采集工具是Kettle和Flume,Flume采集Kafka数据,Kettle采集MySQL数据 离线数仓是Hi…

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

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

2024最新软件测试【测试理论+ 接口测试】面试题(内附答案)

一、测试理论 3.1 你们原来项目的测试流程是怎么样的? 我们的测试流程主要有三个阶段:需求了解分析、测试准备、测试执行。 1、需求了解分析阶段 我们的 SE 会把需求文档给我们自己先去了解一到两天这样,之后我们会有一个需求澄清会议, …

加密/ 解密 PDF:使用Python为PDF文档设置、移除密码

在数字化时代,文档的安全性变得越来越重要。特别是对于包含敏感信息的PDF文件,确保其不被未经授权的人员访问或修改是至关重要的。本文将介绍如何使用Python在PDF文档中设置密码,以及如何移除已经设置的密码。 目录 PDF加密基础知识 Pytho…

蓝桥杯第1593题——二进制问题

题目描述 小蓝最近在学习二进制。他想知道 1 到 N 中有多少个数满足其二进制表示中恰好有 K 个 1。你能帮助他吗? 输入描述 输入一行包含两个整数 N 和 K。 输出描述 输出一个整数表示答案。 输入输出样例 示例 输入 7 2输出 3评测用例规模与约定 对于 30% …

【SQL】1633. 各赛事的用户注册率(COUNT函数 表达式用法)

题目描述 leetcode题目:1633. 各赛事的用户注册率 Code select contest_id, round(count(*)/(select count(*) from Users)*100, 2) as percentage from Register group by contest_id order by percentage desc, contest_id ascCOUNT()函数 COUNT函数用法&#…

C语言联合体,枚举详解

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

易语言控件绑定数据库

易语言是一门中文编程语言,由国人开发,虽然比较冷门,但是在有些场合却非常流行,比如自动化脚本,还有开发外挂。 在易语言中,只要控件的属性里有数据源的都可以与数据库的数据绑定,以下将演示易…

Linux:基本指令篇

文章目录 前言1.ls 指令2.pwd命令3.cd 指令4.touch指令5.mkdir指令(重要)6.rmdir指令 && rm 指令(重要)7.man指令(重要)8.cp指令(重要)9.mv指令(重要&#xff09…

通过Telnet访问网络设备

要通过 Telnet 访问网络设备,需要通过Console端口对网络设备进行基本配置,例如,IP地址、子网掩码、用户名和登录密码等。本实验以路由器为例,交换机远程管理只是接口名字不同而已,路由器用物理接口,交换机用…

mac mini m1芯片 Xcode 15.3 各种报错的问题

错误一: /Users/mac/Desktop/Test_project/mobile-ios/Test/Test-Bridging-Header.h:4:9 failed to emit precompiled header /Users/mac/Library/Developer/Xcode/DerivedData/App-apvcgkuclncgfqdlzqcoffyaexos/Build/Intermediates.noindex/PrecompiledHeaders/…

缓存和缓存的常用使用场景

想象一下,一家公司在芬兰 Google Cloud 数据中心的服务器上托管一个网站。对于欧洲用户来说,加载可能需要大约 100 毫秒,但对于墨西哥用户来说,加载需要 3-5 秒。幸运的是,有一些策略可以最大限度地减少远程用户的请求延迟。 这些策略称为缓存和内容交付网络 (CDN),它们是…

【星海随笔】Ubuntu22.04忘记密码

服务器篇: 有问题可留言。 第一步 远程console界面进入该设备 并重启该设备 如果看到这个界面情况 则点击右上角按钮 【发送 Ctrl+Alt+Delete】 调出grub启动菜单 NOTE:启动的后半段去点击这个按钮,前半段一直点会一直重启 如果是直连服务器,可以快速按下shift键。调出gru…

新能源微电网数据集

需要的同学私信联系,推荐关注上面图片右下角的订阅号平台 自取下载。 微电网(Micro-Grid,MG)由分布式电源(分布式光伏、分散式风电、燃气轮机、电化学储能、超级电容等)、用电负荷(重要、可调等…

3D怎么看模型内部结构---模大狮模型网

在3D建模和设计过程中,了解模型的内部结构是十分重要的。这不仅有助于审美和设计,还能够帮助我们更好地理解模型的构造和特性。模大狮将介绍一些方法和技巧,帮助您探索3D模型的内部结构。 一、使用切片工具 切片模型:通过切片工具…

手机销量分析案例

项目背景 某电商商城随着业务量的发展,积累了大量的用户手机销售订单数据。决策层希望能够通过对这些数据的分析了解更多的用户信息及用户的分布,从而可以指导下一年的市场营销方案以及更加精准的定位市场,进行广告投放。 数据说明 数据时…

等变GNN

非空集合 G G G上定义的二元运算如果满足某些性质,就构成了一个群。常见的群有: O ( n ) O(n) O(n): n n n维正交群,包含旋转和反演操作,反演可以理解为推理或者映射。 S O ( n ) SO(n) SO(n): n n n维特殊…