超级增强开发者体验的Python装饰器 🚀
Python装饰器 🚀
Python的@overload
装饰器,位于Python内置模块typing
中,允许开发者为函数或方法指定多个特定类型的签名。这为更清晰的类型检查和增强的IDE工具提供了基础。
为什么它很重要?⚠️
@overload
装饰器被广泛使用,通常无需我们明确地认识到它的存在。
你是否曾经想过内置的Python函数(如max()
)如何接受多种参数排列方式,而你的IDE又知道如何处理它们?
考虑下面的示例中max()
函数的多样性。我们可以以不同的方式使用该函数。
但是一旦你提供了一个错误的参数,你的IDE会立即提醒你有一个意外的参数。
那么,它是如何工作的?⚙️
@overload
装饰器向静态类型检查器和IDE提供了有关潜在用法的线索。因此,可以验证对重载函数或方法的调用是否与定义的签名之一匹配,在开发过程中突出显示差异。
每个重载声明处理特定的参数和输出类型。
Declarai在真实世界中的使用案例 ✅
在开发Declarai – 一个将Python代码转换为LLM任务的开源框架时,我发现使用重载的惊人优势。
Declarai包提供了一个接口,用于与各种提供者的AI模型进行交互。然而,初始化这些模型并不简单。每个提供者都有自己独特的模型、配置和相关的API令牌。这就是overload
派上用场的地方。我们使用overload
来指导开发者关于每个提供者的有效参数组合,而不是依赖于运行时错误来指导开发者。
GitHub — vendi-ai/declarai: 一个简单而可扩展的用于在真实世界中使用LLMs的框架
一个简单而可扩展的用于在真实世界中使用LLMs的框架。从小开始,随需求增长…
github.com
我们如何使用@overload?
在Declarai的主要接口中,我们的目标是指导开发者正确地使用适当的语言模型配置初始化Declarai类。
因此,我们可以使用以下方式使用@overload装饰器来帮助开发者使用来自OpenAI、Huggingface和AI21的模型进行初始化。
class Declarai: @overload def __init__( self, provider: ProviderOpenai, model: ModelsOpenai, version: Optional[str] = None, openai_token: Optional[str] = None, ): ... @overload def __init__( self, provider: ProviderHuggingface, model: str, hub_api_token: Optional[str] = None, ): ... @overload def __init__( self, provider: ProviderAI21, model: ModelsAI21, ai21_api_token: Optional[str] = None, ): ... def __init__(**kwargs): # Let's ignore the actual implementation since its # not relevant to showcase overloads usage print(**kwargs)
在上面的示例中,您可以看到为每个提供程序设置了不同的初始化器。这确保开发人员在选择的提供程序上获得有关适当的模型名称、配置设置和令牌参数的指导。
免责声明 – 上述示例中并非所有提供程序都在Declarai中实现。那只是一个例子。
这对开发人员的体验有何影响?🤩
请考虑以下PyCharm示例:
您可以观察到PyCharm IDE如何提醒您有关无效模型和参数组合以及意外参数的警告。
哇!这比遇到运行时错误更可取,不是吗?
结论
在Python中,overload
装饰器不仅仅是一种类型检查工具。在复杂的系统接口中,它起到了引导作用,确保开发人员选择正确的选项并提供适当的参数。这些“小”事情可以创建出直观且抗错误的开发人员体验。
关注 Declarai 📩
希望您喜欢这篇文章,我强烈建议您关注我的Linkedin页面。
此外,我鼓励您实时探索Declarai,并亲眼见证与利用重载使开发人员体验更好的框架一起工作的美妙之处。
查看文档 📖
Declarai
Declarai,将Python代码转换为LLM任务,易于使用且准备就绪。Declarai将您的Python代码转换为…
vendi-ai.github.io
在github上给我们一个星星⭐️
GitHub – vendi-ai/declarai:一个简单但可扩展的用于在实际应用中使用LLMs的框架…
一个简单但可扩展的用于在实际应用中使用LLMs的框架。从小开始,根据需求逐渐扩展!…
github.com