面向对象的 CLI:使用 Fire 简化类和对象的方法暴露 (中英双语)
面向对象的 CLI:使用 Fire 简化类和对象的方法暴露
在传统的命令行工具开发中,argparse
是最常用的库之一,用于处理命令行参数和配置。它通常用于函数式编程,但在处理类和对象时,使用起来可能不如 Fire 方便。Fire 是一个自动生成命令行接口的库,不仅支持函数,还能够支持类和对象。它通过动态地将 Python 类的属性和方法暴露给命令行,极大地简化了命令行工具的开发过程。
本文将探讨 Fire 如何支持类和对象,并通过一个示例来展示它的优势。我们将详细讲解代码,并分析 Fire 如何实现这一功能。
Fire 如何支持类和对象?
在使用 Fire
时,我们可以将类及其方法直接暴露为命令行工具,而无需手动设置参数解析。Fire 会自动分析类的构造函数(__init__
)和方法(def
),并生成对应的命令行接口。
关键原理:
- 自动映射:Fire 会扫描类的构造函数和方法,自动识别方法参数,并将它们映射为命令行参数。
- 递归支持:如果类方法中还有其他类的实例,Fire 会递归地将这些类和方法也暴露给命令行。
- 自动类型推断:Fire 会根据函数签名推断参数的类型,包括数字、布尔值和字符串等。
通过这种方式,Fire 可以非常方便地将类及其方法转化为命令行工具,并允许用户像调用普通命令行工具一样,传递参数给类的方法。
示例:使用 Fire 曝露类和对象
让我们通过一个简单的例子来演示 Fire 如何支持类和对象。
代码示例
import fireclass DatasetManager:def __init__(self, repo_id):self.repo_id = repo_iddef upload(self, version: str, overwrite=False):print(f"Uploading dataset version {version} to {self.repo_id}...")if overwrite:print(f"Overwriting existing version {version}.")else:print(f"Version {version} will be added without overwriting.")def list_tags(self):print(f"Listing tags for {self.repo_id}...")class CLI:def __init__(self, repo_id):self.manager = DatasetManager(repo_id)def upload(self, version: str, overwrite=False):self.manager.upload(version, overwrite)def list_tags(self):self.manager.list_tags()if __name__ == "__main__":fire.Fire(CLI)
代码解析
-
DatasetManager 类:
DatasetManager
类包含两个方法:upload
和list_tags
。upload
方法用于上传数据集并可选择是否覆盖现有版本,而list_tags
用于列出数据集的标签。
-
CLI 类:
CLI
类封装了DatasetManager
类的实例,并将其方法暴露为命令行工具。用户可以通过CLI
类的方法来操作DatasetManager
。
-
fire.Fire(CLI):
fire.Fire(CLI)
让CLI
类的所有方法变成命令行工具,CLI
的每个方法会成为一个命令。
运行命令行
假设我们保存了以上代码到一个文件 cli_tool.py
,然后通过命令行运行:
- 上传数据集:
$ python cli_tool.py upload v1.0 --overwrite
Uploading dataset version v1.0 to None...
Overwriting existing version v1.0.
- 列出标签:
$ python cli_tool.py list_tags
Listing tags for None...
解析
- 在命令行中,
upload
和list_tags
方法分别映射为两个命令。用户只需要按照方法的签名提供相应的参数,Fire 会自动处理参数解析。 version
和overwrite
被视为upload
方法的命令行参数,而repo_id
是DatasetManager
类的一个实例属性,默认在创建时传入。
自动生成 CLI 的工作原理
Fire 的核心机制是在后台使用 Python 的反射功能来检查类及其方法。当调用 fire.Fire(CLI)
时,Fire 会:
- 扫描
CLI
类中的所有方法。 - 检查每个方法的参数类型,并生成相应的命令行选项。
- 如果方法中使用了其他类的实例,Fire 会递归地处理这些实例,使得整个类层级都能通过命令行操作。
Fire 的这个特性使得开发者能够快速为现有的类和对象生成命令行工具,而不需要编写冗长的命令行参数解析代码。
总结
Fire 的强大之处在于它能够简化命令行工具的开发,特别是对于包含多个类和对象的复杂项目。通过自动识别类的方法和参数,Fire 提供了一个简洁而强大的方式,将类和对象暴露为命令行接口。这种方式不仅减少了开发者的工作量,还提高了代码的可读性和可维护性。
对于那些需要在命令行中操作多个类或方法的情况,Fire 无疑是一个更合适的选择,特别是在需要快速原型开发时,它的面向对象支持使得代码更加简洁高效。
Object-Oriented CLI: How Fire Supports Classes and Objects
When developing command-line interfaces (CLI) in Python, libraries like argparse
are commonly used for parsing command-line arguments. However, when it comes to dealing with classes and objects, Fire, a Python library developed by Google, offers significant advantages over argparse
. Unlike argparse
, which requires manually setting up argument parsing for each function, Fire can automatically expose Python classes, methods, and attributes as command-line commands, making it a more flexible and convenient tool for building CLIs.
In this blog post, we’ll explore how Fire supports classes and objects, demonstrate it with a code example, and dive into the internal workings of how Fire makes this possible.
How Fire Supports Classes and Objects
Fire simplifies the process of exposing Python classes and their methods as command-line interfaces by dynamically creating a CLI based on the structure of the class. It recursively discovers class methods and instance variables, making them available as command-line arguments.
Key Principles:
- Automatic Mapping: Fire scans classes and methods, automatically turning them into CLI commands.
- Recursive Support: If a method requires another class instance, Fire automatically makes that class and its methods available as subcommands.
- Type Inference: Fire can infer argument types based on the function signature, including strings, integers, booleans, etc.
This dynamic generation of CLI commands makes it incredibly easy to turn an object-oriented class into a functional command-line tool.
Example: Using Fire with Classes and Objects
Let’s walk through a simple example where we use Fire to expose a class and its methods via the command line.
Code Example
import fireclass DatasetManager:def __init__(self, repo_id):self.repo_id = repo_iddef upload(self, version: str, overwrite=False):print(f"Uploading dataset version {version} to {self.repo_id}...")if overwrite:print(f"Overwriting existing version {version}.")else:print(f"Version {version} will be added without overwriting.")def list_tags(self):print(f"Listing tags for {self.repo_id}...")class CLI:def __init__(self, repo_id):self.manager = DatasetManager(repo_id)def upload(self, version: str, overwrite=False):self.manager.upload(version, overwrite)def list_tags(self):self.manager.list_tags()if __name__ == "__main__":fire.Fire(CLI)
Explanation of the Code
-
DatasetManager Class:
- Contains methods for uploading datasets (
upload
) and listing dataset tags (list_tags
). - The
upload
method has parameters forversion
andoverwrite
.
- Contains methods for uploading datasets (
-
CLI Class:
- Encapsulates an instance of
DatasetManager
and exposes its methods (upload
andlist_tags
) to the command line.
- Encapsulates an instance of
-
fire.Fire(CLI):
- This line exposes all the methods of the
CLI
class to the command line.CLI
methods become commands that can be executed with arguments.
- This line exposes all the methods of the
Running the CLI
Assuming you saved the above code to a file named cli_tool.py
, you can execute it from the command line like this:
-
Upload Dataset:
$ python cli_tool.py upload v1.0 --overwrite Uploading dataset version v1.0 to None... Overwriting existing version v1.0.
-
List Tags:
$ python cli_tool.py list_tags Listing tags for None...
What Happens Behind the Scenes
- Fire automatically exposes the methods
upload
andlist_tags
as CLI commands. - It takes care of parsing the arguments (
version
,overwrite
) and passing them to the corresponding method ofDatasetManager
. - The
repo_id
is passed during the initialization of theCLI
class, making it accessible inDatasetManager
.
How Fire Implements Object-Oriented CLI
Internally, Fire works by using Python’s reflection capabilities to inspect classes and methods. Here’s how it works step by step:
- Class Inspection: Fire inspects the class passed to
fire.Fire()
, discovering all methods and attributes. - Argument Mapping: For each method, Fire maps function parameters to command-line arguments.
- Recursive Command Creation: If a method contains an object or class instance, Fire recursively creates commands for that class as well.
- Argument Parsing: Fire uses Python’s built-in
argparse
module behind the scenes to handle argument parsing, but it generates the required configuration automatically based on the class signature.
This mechanism allows you to expose complex class hierarchies and objects without manually writing out argument parsing code.
Conclusion
Fire offers an elegant and efficient way to create CLIs from Python classes and objects. By automating the argument mapping and recursion, Fire eliminates much of the boilerplate code required by traditional CLI libraries like argparse
. This makes Fire an excellent choice when working with complex object-oriented structures or when you need to quickly prototype command-line tools.
Whether you’re building a simple script or a large application with multiple classes, Fire provides a seamless interface to expose your code to the command line. Its automatic argument parsing, support for recursion, and object-oriented design make it a powerful tool for any developer looking to create a flexible and maintainable CLI.
后记
2024年12月15日19点40分于上海,在GPT4o mini大模型辅助下完成。
相关文章:
面向对象的 CLI:使用 Fire 简化类和对象的方法暴露 (中英双语)
面向对象的 CLI:使用 Fire 简化类和对象的方法暴露 在传统的命令行工具开发中,argparse 是最常用的库之一,用于处理命令行参数和配置。它通常用于函数式编程,但在处理类和对象时,使用起来可能不如 Fire 方便。Fire 是…...

flutter控件buildDragTargetWidget详解
文章目录 1. DragTarget 的核心概念基本属性 2. 基本用法3. 使用 buildDragTargetWidget4. 常见场景5. 注意事项 buildDragTargetWidget 不是 Flutter 中的内置 API 或方法,但根据命名习惯,它很可能是您正在实现或使用的一个方法,用于在 Flut…...

使用webrtc-streamer查看实时监控
摄像头配置(海康摄像头为例) 摄像头视频编码应改成H264格式 webrtc-streamer下载 webrtc-streamer下载地址 下载后解压出来双击运行,端口默认8000 VUE2项目引入文件 在项目静态文件“public”中需引入两个js文件“webrtcstreamer.js”与“…...

【数据分享】2014-2024年我国POI兴趣点数据(免费获取/来源于OSM地图)
POI是Point of Interest的简称,意为“兴趣点”,是互联网电子地图中用于表示特定位置的地理实体的核心数据类型。POI通常用于标注具体地点,例如餐厅、商场、学校、医院、景点等。这些数据以点的形式呈现,并附带详细属性信息&#x…...
Leetcode 3389. Minimum Operations to Make Character Frequencies Equal
Leetcode 3389. Minimum Operations to Make Character Frequencies Equal 1. 解题思路2. 代码实现 题目链接:3389. Minimum Operations to Make Character Frequencies Equal 1. 解题思路 这一题从答题从test的结果来说来说做出的人很少,主要确实有些…...
Vite 与 Webpack 的区别
在前端开发中,构建工具是不可或缺的,Webpack 和 Vite 是当前最流行的选择之一。尽管它们的目标相似,但在实现方式和开发体验上却有显著差异。本文将探讨 Vite 和 Webpack 的主要区别,以便于根据项目需求选择合适的工具。 1. 构建…...

基于32单片机的RS485综合土壤传感器检测土壤PH、氮磷钾的使用(超详细)
1-3为RS485综合土壤传感器的基本内容 4-5为基于STM32F103C8T6单片机使用RS485传感器检测土壤PH、氮磷钾并显示在OLED显示屏的相关配置内容 注意:本篇文件讲解使用的是PH、氮磷钾四合一RS485综合土壤传感器,但里面的讲解内容适配市面上的所有多合一的RS…...

【从零开始入门unity游戏开发之——C#篇11】一个标准 C# 程序介绍、新的值类型——枚举
文章目录 一、一个标准 C# 程序1、文件名(Program.cs):2、 using 语句:3、命名空间(namespace)4、类(class):4、入口函数(Main 方法)5、程序运行流…...
vue 签名校验 md5 uuid
import CryptoJS from crypto-js import uuid from /utils/uuid import { SECRET_KEY } from /utils/config // 签名校验 const nonceStr uuid.uuid() const timestamp new Date().getTime() // const sign CryptoJS.MD5(nonceStr nonceStr &secretKey SECRET_KEY …...
CSS系列(16)-- 架构与模式详解
前端技术探索系列:CSS 架构与模式详解 🏗️ 致读者:探索 CSS 架构的艺术 👋 前端开发者们, 今天我们将深入探讨 CSS 架构与设计模式,学习如何构建可维护的样式系统。 CSS 架构方法论 🚀 OO…...
【go语言】reflect包与类型推断
reflect 包的核心概念 Go 中的反射涉及两个核心概念: Type:表示一个类型的结构体,reflect.Type 是类型的描述。Value:表示一个值的结构体,reflect.Value 是一个具体值的包装。 反射让我们能够动态地访问对象的类型和…...
3.python运算符
Python 提供了多种运算符,用于执行算术、比较、逻辑等各种操作。以下是 Python 中常见的运算符类型及其用法: 文章目录 1. 算术运算符2. 比较运算符3. 逻辑运算符4. 赋值运算符5. 位运算符6. 成员运算符7. 身份运算符8. 运算符优先级 1. 算术运算符 算…...

【竞技宝】CS2-上海major:spirit力克MOUZ niko梦碎
北京时间2024年12月15日,CS2上海major正在如火如荼的进行中,昨日迎来两场半决赛MOUZ对阵spirit以及FAZE对阵G2。Spirit和MOUZ和各自赢下了自己的选图之后,spirit双子星在图三抗住压力帮助队伍杀入决赛。而G2和FAZE的比赛中,FAZE依然延续上一场的火热手感完全压制了G2,G2的明星选…...
【Leetcode 每日一题】3266. K 次乘运算后的最终数组 II
问题背景 给你一个整数数组 n u m s nums nums,一个整数 k k k 和一个整数 m u l t i p l i e r multiplier multiplier。 你需要对 n u m s nums nums 执行 k k k 次操作,每次操作中: 找到 n u m s nums nums 中的 最小 值 x x x&a…...
etcd集群常见日志
1、节点失去领导者 {"level":"info","ts":"2024-05-07T01:54:04.948Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"raft.node: 9afce9447872453 lost le…...
【漫话机器学习系列】005.神经网络的结构(architecture on the neural network)
神经网络(Neural Network)是一种模拟人脑神经系统的计算模型,由大量相互连接的神经元(节点)组成,广泛应用于深度学习和机器学习领域。以下是神经网络的基本结构及关键组成部分。 1. 神经网络的基本组成 一…...
基于 Couchbase 数据仓库元数据管理的可行性方案
在大数据体系中,元数据管理是数据治理的关键一环。以下是一套元数据管理的可行性方案,适合你的当前架构设计(基于 Couchbase 数据仓库)并支持高效管理数据的分层与结构。 1. 元数据管理的目标 统一数据管理:清晰描述 …...

SpringBoot:快速构建微服务应用
一、SpringBoot简介 什么是SpringBoot 是由Pivotal团队提供的快速开发框架。它基于Spring框架,可以用于快速构建微服务应用程序。SpringBoot提供了一种快速、便捷的方式来启动和配置一个基于Spring的应用程序,它封装了很多常用的配置,简化了开…...

汽车嵌入式软件构建高效技术团队的全面思考
在汽车嵌入式软件开发领域,构建一支高效的通用技术团队至关重要。这类团队负责为各种项目提供可复用、标准化的技术基石,从而提高开发效率、降低成本并确保产品质量。构建这样的团队需要从技术能力、角色分工、标准化与复用、流程管理与质量保证、工具和…...

【跨库查询、多库查询】.NET开源 ORM 框架 SqlSugar 系列
文章目录 一、跨库方式1:跨库导航二、手动跨库查询三、同服务器:自动查询跨库查询3.1 Mysql和SqlServer自动3.2 自动: PgSql跨Scheme查询3.3 其他库同服务器 四、跨服务器:自动跨库查询4.1 配置SqlServer dblink4.2 配置 Oracle dblink4.3 配…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...