简单而复杂的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.hqwc.cn/news/586782.html

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

相关文章

关于loop( ) 阻塞和非阻塞探究

一、SIR的补充 在上几篇博客中,有朋友私信问我,在ticker函数程序和中断服务程序(ISR)中写 物联网请求报错。怎么回事,在此解释。控制台如下 1.1解释 在使用 Ticker 函数和中断服务程序(ISR)时…

C++面向对象程序设计 - 访问对象中成员的3种方法

在C程序中访问对象的成员变量和成员函数,有三种方法: 通过对象名和成员运算符访问对象中的成员;通过指向对象的指针访问对象中的成员;通过对象的引用变量访问对象中的成员 在了解访问对象中成员的3种方法前,先了解下C…

蓝桥杯真题:单词分析

import java.util.Scanner; //1:无需package //2: 类名必须Main, 不可修改 public class Main{public static void main(String[]args) {Scanner sannernew Scanner(System.in);String strsanner.nextLine();int []anew int [26];for(int i0;i<str.length();i) {a[str.charA…

4.2 c++

#include <iostream>using namespace std; int Max10; class Stack { public:int* base;//栈底&#xff1b;int* top;//栈顶&#xff1b;void creat(Stack& s);//初始化顺序栈void in(Stack& s);//入栈void out(Stack& s);//出栈void empty(Stack& s);//…

Ps:颜色查找

颜色查找 Color Lookup命令通过应用预设的 LUT 来改变图像的色彩和调性&#xff0c;从而为摄影师和设计师提供了一种快速实现复杂色彩调整的方法&#xff0c;广泛应用于颜色分级、视觉风格的统一和创意色彩效果的制作。 Ps菜单&#xff1a;图像/调整/颜色查找 Adjustments/Colo…

栈溢出攻击的软硬件缓解技术

为了防范栈溢出攻击&#xff0c;现代处理器架构&#xff08;如Arm架构&#xff09;具有执行权限。在Armv8-A中&#xff0c;主要的控制是在MMU地址转换表&#xff08;translation tables&#xff09;中的执行权限位。 UXN User (EL0) Execute-never …

什么是AIGC,AIGC的应用领域有哪些,以及对AIGC的未来展望有什么值得关注的方向

AIGC:人工智能生成内容的深度解析 在数字技术的浪潮中,AIGC(ArtificialIntelligenceGeneratedContent,人工智能生成内容)逐渐崭露头角,成为继专业生产内容(PGC)和用户生产内容(UGC)之后的新型内容创作方式。它不仅改变了内容生产的传统模式,更在多个行业中展现出…

Hive on Spark 配置

目录 1 Hive 引擎简介2 Hive on Spark 配置2.1 在 Hive 所在节点部署 Spark2.2 在hive中创建spark配置文件2.3 向 HDFS上传Spark纯净版 jar 包2.4 修改hive-site.xml文件2.5 Hive on Spark测试2.6 报错 1 Hive 引擎简介 Hive引擎包括&#xff1a;MR&#xff08;默认&#xff09…

js使用canvas实现画roi功能,并实现交集并集差集操作,附源码

效果概览 支持圆形,矩形,旋转矩形绘制,鼠标像素拾取,图片缩放,图片拖拽,像素测量,roi交集并集补集输出 TODO:实现自由路径绘制,与后台交互数据 实现原理 交集并集差集使用像素做运算,使用0代表没有像素,1代表有像素,然后再做运算 // 计算交集calculateIntersec…

腾讯电商再度回归!视频号小店成为今年最强黑马?

大家好&#xff0c;我是电商小布。 现在在电商的这个圈子里&#xff0c;视频号这个项目&#xff0c;也是常常被大家提起。 特别是在新型电商玩法的发展下&#xff0c;传统电商已经不足以满足客户的需求&#xff0c;搞流量才是重点。 而在这其中&#xff0c;抖音、视频号这两…

Flume学习笔记

视频地址:https://www.bilibili.com/video/BV1wf4y1G7EQ/ 定义 Flume是一个高可用的、高可靠的、分布式的海量日志采集、聚合和传输的系统。 Flume高最要的作用就是实时读取服务器本地磁盘的数据,将数据写入HDFS。 官网:https://flume.apache.org/releases/content/1.9.0/…

TikTok账号被封是为什么?如何解决?

多人在使用TikTok的过程中都会遇到一些问题&#xff0c;比如为什么TikTok没有浏览量&#xff1f;事实上&#xff0c;这很可能是因为你的账号已被禁止。但为什么它会被封呢&#xff1f;你怎样才能解决它&#xff1f; 一、TikTok账号为什么被封&#xff1f; 1、什么是 TikTok 影…