点我展开:基本信息
提升class的可读性、可维护性、可测试性、可扩展性,贴近大厂工程标准。
个人问题
MCP是什么?
MCP(Model Context Protocol,模型上下文协议)是 Anthropic 在 2024 年底推出的开放标准,目标是让大模型像插 USB-C 一样,“一次对接,多端兼容”地调用外部数据与工具,解决“每换一个新数据源就要重写一套接口”的痛点[@jasonstrimpel]。
一句话理解:
MCP = AI 世界的“USB-C 接口”——只要数据源或工具提供 MCP 服务器,任何支持 MCP 的 AI 应用(Claude、Cursor、自研 Agent 等)都能直接读写数据、调用函数,无需额外适配。
1. 核心角色(客户端-服务器架构)
| 角色 | 作用 |
|---|---|
| MCP Host | AI 应用本体(Claude Desktop、Cursor、自研 Agent) |
| MCP Client | 运行在 Host 内部,与 MCP 服务器 1:1 建立连接 |
| MCP Server | 暴露“工具/资源/提示模板”的轻量级网关,可由官方、社区或企业自研 |
2. 一次典型交互流程
- 用户提问:“把昨晚的订单报表转成 Markdown 并发到 Slack”
- Host 内的 Client 向本地或远程的 MCP Server 发 JSON-RPC 请求
- Server 完成 SQL 查询、文件读取、格式转换、Slack API 调用等操作
- 结果流式返回给 Host,大模型汇总后展示给用户[@jasonstrimpel]
3. 官方已提供的“即插即用”服务器
- 文件系统(读本地文件、列目录)
- PostgreSQL / SQLite(直接跑 SQL)
- GitHub(查 Issue、拉代码)
- Slack / Discord / Google Drive / Excel / PPT……
全部开源,一行命令启动,省去自己拼 API、鉴权、分页、重试等脏活累活[@jasonstrimpel]。
4. 与 Function Calling 的区别
- Function Calling = 模型“决定”要调哪个函数,但函数代码仍写在本地工程里
- MCP = 把函数/数据源拆成独立进程或服务,生命周期与主程序解耦,可热插拔、可复用、可共享[@jasonstrimpel]
5. 应用场景举例
- 企业知识库:MCP Server 直接对接内网 Confluence、ERP,员工用自然语言查询敏感数据,无需复制粘贴
- DevOps 助手:Agent 通过 MCP 同时查 GitHub、读 K8s 日志、改 Terraform 文件,一站式完成故障排查
- 投研自动化:券商用 MCP 把 Wind/同花顺 API 包装成服务器,研究报告自动生成并回写数据库
6. 如何开始
- 装 Claude Desktop → Settings → MCP → 添加官方
mcp-servers仓库路径 - 启动所需 Server(如
npx @mcp/server-filesystem ./docs) - 立即在对话框里让 Claude “总结 docs 目录下所有 Markdown 的要点”——零代码集成
总结:MCP 不是又一个“中间层框架”,而是让 AI 应用与外部世界说同一种语言的协议;对开发者,它把“写胶水代码”变成“启动服务器”;对企业,它把数据孤岛变成可插拔的乐高积木。
UV是什么?
其环境是依附于该项目的路径下的,不是像conda自己单独在一个地方创建环境,不同项目都可以调用。
下面给出一份“写给 2025 新手的 UV 速通教程”:先一句话说清它到底有什么用,再按“安装→常用命令→与 conda 同框对比→实战例子”四步带你跑通,全程复制粘贴即可。
1. UV 是干什么的?
- 一句话:极速版 “pip + venv + poetry” 三合一——安装包快 10-100 倍,还能锁版本、建虚拟环境、一键跑脚本。
- 专注 纯 Python 场景;遇到 CUDA/MKL/R 包等跨语言需求时,再请 conda 出山。
2. 30 秒完成安装(Windows / macOS / Linux 通用)
# ① 官方一键脚本(推荐)
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows 用 PowerShell
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
# ② 验证
uv --version # 看到 uv x.y.z 即成功
装完重新开一下终端,自动把
~/.local/bin加入 PATH。
3. 新手 6 条必会命令(边做边体会速度)
| 任务 | UV 命令 | 对应 conda 命令 | 体感速度 |
|---|---|---|---|
| 创建环境 | uv venv |
conda create -n myenv |
⚡<1 s vs 30 s |
| 激活环境 | source .venv/bin/activate【.venv\Scripts\activate.bat】 |
conda activate myenv |
同样 source,但 UV 环境体积 <100 MB |
| 安装包 | uv pip install pandas |
conda install pandas |
⚡2 s vs 45 s |
| 锁版本 | uv lock |
conda env export |
自动生成 uv.lock,跨平台一致 |
| 复现环境 | uv sync |
conda env create -f env.yml |
⚡秒级 vs 分钟级 |
| 临时跑脚本 | uv run script.py |
需先建环境再跑 | 自动拉依赖、跑完即删,CI 神器 |
4. 与 conda 同框对比(2025 实测数据)
| 维度 | UV | conda |
|---|---|---|
| 设计目标 | 极速纯 Python 包管理 | 跨语言全家桶 |
| 包来源 | PyPI | conda-forge + PyPI |
| 安装速度 | 8 s(冷)/ 2 s(缓存) | 45 s / 12 s |
| 环境体积 | 几十~几百 MB | 1–5 GB(含系统库) |
| 非 Python 依赖 | ❌(需手动装 CUDA 等) | ✅cudatoolkit=12.1一键搞定 |
| 锁文件 | 原生 uv.lock |
environment.yml(需导出) |
| 适用场景 | Web、脚本、API、CI | 数据科学、GPU、R 语言、多语言混合 |
5. 实战:用 UV 启动一个最小 Web 项目
# ① 建项目目录
mkdir demo && cd demo
# ② 同时创建环境 + 安装依赖(一条命令)
uv pip install fastapi[all] uvicorn
# ③ 写 main.py
cat > main.py <<'EOF'
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root(): return {"Hello": "UV"}
EOF
# ④ 直接运行(无需手动激活环境)
uv run uvicorn main:app --reload
# 浏览器打开 http://127.0.0.1:8000 看到 {"Hello":"UV"}
整个流程 30 秒完成,依赖包首次安装仅 3 秒,后续
uv run毫秒级启动。
6. 什么时候该回到 conda?
- 需要 CUDA/cuDNN/MKL/OpenMPI 等系统级二进制
- 项目里同时出现 Python + R + Julia 多语言
- 团队已统一用
environment.yml做镜像分发
策略:conda 打地基(装系统库)→ uv 盖楼房(装纯 Python 包),两条命令可混用,互不冲突。
7. 总结口诀
“日常 Python 写代码,先装 uv 准没错;
遇到 GPU 科学库,conda 再把坑来填。”
把上面 6 条命令敲一遍,你就能体验到“秒装、秒建、秒跑”的快感;后续深入阅读 uv help 或官方文档即可继续进阶。祝开发愉快!
其他问题
uv的基本设计逻辑。
“以声明式配置为中心,通过极致的性能实现环境的确定性。”的目标是让你感觉不到包管理器的存在,同时又保证你的代码在任何地方运行的结果都一模一样。
uv的设计逻辑是把 Python 环境看作一个可以随时丢弃并瞬间重建的“投影”。你只需要守护好pyproject.toml这个“本体”,剩下的所有繁琐工作(下载、链接、冲突解决、版本切换)都由uv这种 Rust 编写的引擎以毫秒级的速度完成。uv是如何通过几种文件来实现这种逻辑的?
- 第一层:
pyproject.toml:采用声明式逻辑。通常包含宽泛的版本范围。例如:requests >= 2.28.0。当你运行uv add时,它会修改此文件。它代表了项目的最小约束集。 - 第二层:
uv.lock:记录每一个包(包括间接依赖)的精确版本(如requests == 2.31.0)。包含依赖树的完整拓扑结构。当你运行uv lock或uv sync时,uv会进行复杂的数学运算(依赖解析),确保所有包互不冲突,并把结果写死在这里。 - 第三层:
.venv:包含 Python 解释器、Site-packages 文件夹、可执行脚本。
- 第一层:
| 文件 | 谁读/写 | 核心价值 | 是否提交到 Git |
|---|---|---|---|
pyproject.toml |
开发者 / uv | 定义项目需求与元数据 | 必须提交 |
uv.lock |
uv 自动维护 | 保证所有人的环境 100% 一致 | 强烈建议提交 |
.venv/ |
Python 解释器 | 物理运行空间 | 绝对不要提交 |
基本的工作流。
输入命令:执行
uv add pandas。修改意图:
uv将pandas写入pyproject.toml。计算约束:
uv扫描pyproject.toml,结合已有的uv.lock,计算出一套不冲突的、最新的依赖方案,并更新uv.lock。物理对齐:
uv根据lock文件检查当前的.venv。如果里面少了包,就从全局缓存链接过来;如果多了包(配置里删了),就从.venv里移除。
pyproject.toml是从哪里来的? 对于一个新文件夹开始项目,那直接
uv init会自动生成toml文件。或者直接uv add xx这个时候发现没有toml文件,会生成该文件。toml严格保持环境的干净,它可以自动管理uv.lock,若toml未记录当前环境存在其他包,uv会删除对于的包,并严格安装toml间记录的依赖。常见更新命令总结。
| 动作 | 命令 | 结果 |
|---|---|---|
| 新增包 | uv add 包名 |
自动更新 pyproject.toml 和 uv.lock |
| 删除包 | uv remove 包名 |
自动从 pyproject.toml 中移除并清理环境 |
| 升级所有包 | uv lock --upgrade |
保持 pyproject.toml 不变(toml文件是一个范围,例如>=0.0.2),所有包都升级到 pyproject.toml 允许范围内的最新版本。【可能出现冲突】 |
| 同步到环境 | uv sync |
确保 .venv 完美匹配当前的 pyproject.toml 和 uv.lock |
Modelscope装不了?
项目纯在中文路径。
Modelscope是什么?
ModelScope(中文名“魔搭”)是阿里巴巴达摩院在 2022 年开源的 一站式模型即服务(MaaS)平台,定位相当于“中国版 Hugging Face”:把分散在高校、企业和社区的预训练模型集中到一起,提供“下载-体验-微调-部署”全链路工具,降低 AI 应用门槛。
一句话理解:
ModelScope = 模型仓库 + 在线体验中心 + 微调训练平台 + 部署 serving 工具链。
1. 核心能力
| 能力 | 说明 | 示例 |
|---|---|---|
| 海量预训练模型 | NLP、CV、语音、多模态、科学计算等 1000+ 模型一键下载 | BERT、YOLO、Stable Diffusion、通义千问系列 |
| Pipeline API | 三行代码完成推理 | pipeline('image-portrait-stylization', model='damo/cv_unet_person-image-cartoon') |
| 微调与训练 | 提供 Trainer、MsDataset 统一接口,支持全参数、LoRA、Adapter 等多种微调策略 |
上传自己的数据即可微调 |
| 在线体验 | 网页直接上传图片/文本,实时看效果 | 无需写代码 |
| 部署 & Serving | 一键导出为 RESTful API 或部署到阿里云 PAI、本地服务器 | modelscope serve 或 Studio 发布 |
| 开放社区 | 开发者可上传模型、写 Notebook、讨论、点赞 | 类似 GitHub 的 PR/Issue 机制 |
2. 与「大模型」区别
- ModelScope 是“应用商店”——容器里有很多 App(模型);
- 通义千问、Stable Diffusion 等是“单个超级 App”——只是商店里的一个商品。
3. 典型使用场景
快速体验
官网直接拖图片 → 秒出卡通化结果。原型开发
from modelscope.pipelines import pipeline cartoon = pipeline('image-portrait-stylization', model='damo/cv_unet_person-image-cartoon') result = cartoon('photo.jpg')微调私有数据
from modelscope.msdatasets import MsDataset from modelscope.trainers import build_trainer ds = MsDataset.load('my_data') trainer = build_trainer('train_config.json') trainer.train()生产部署
- 导出 ONNX / TorchScript
- 一键发布为在线 API 或边缘设备容器镜像。
4. 缓存与 CLI
- 首次下载自动缓存到
~/.cache/modelscope/hub/(可自定义MODELSCOPE_CACHE)。 - 提供
modelscope命令行工具:下载、上传、缓存管理、serve 部署都能一行搞定。
5. 免费额度
每日 2000 次免费 API 调用,足够开发/调试阶段使用。
总结:
ModelScope 把「找模型-下模型-跑模型-调模型-发模型」做成一条命令或几行代码,让 AI 开发像装 App 一样简单;你是使用者、贡献者还是部署者,都能在这个平台里一站式完成。
BAAI/bge-base-zh-v1.5是什么?虚拟环境下是装在哪里的?
BAAI/bge-base-zh-v1.5 是由北京智源人工智能研究院(BAAI)发布的中文文本 Embedding(嵌入)模型,专精「把任意中文句子映射成固定 768 维向量」这一件事,属于 BGE 系列中的「Base」量级,兼顾体积与精度,是目前中文语义检索、RAG(检索增强生成)场景的主流基础模型之一。
一句话用途
给定一段中文文本 → 模型输出一个 768 维向量 → 用向量相似度(余弦/点积)即可判断两句话是否「语义相近」,常用于知识库问答、文档排序、聚类等任务。
核心信息
- 开发者:智源研究院(BAAI)
- 模型类型:Transformer-based 文本嵌入模型
- 参数量:≈ 102 M
- 输出维度:768
- 最大输入:512 token(≈ 300 个汉字)
- 协议:MIT,可商用
- 评测成绩:C-MTEB 67.5(2023-09 数据)
- 特点:
– 针对中文专门训练,对成语、口语、专业词表现优于通用多语言模型;
– 支持「指令式检索」——在 query 前加提示词可进一步提升召回精度;
– 体积适中,GPU/CPU 推理都可快速部署;
– 与 FlagEmbedding、sentence-transformers、LangChain、Qdrant 等框架即插即用。
典型用法(sentence-transformers 一行代码)
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("BAAI/bge-base-zh-v1.5")
vec = model.encode("人工智能是一门研究如何让机器具有智能的科学")
print(vec.shape) # (768,)
因此,当你用 modelscope download --model BAAI/bge-base-zh-v1.5 时,实际下载的就是这个「中文 Base 级文本向量化器」的权重文件,随后可离线或在线生成句子向量,用于语义检索、问答、聚类等任务。
它是装在一个可自定义的路径下面的。
uv run black . uv run ruff check .什么作用?
这两条命令是「一行代码」完成代码质量检查的黄金组合,作用如下:
① uv run black .
- Black 是 “零配置” 的 Python 代码格式化工具。
- 这条命令会把当前目录及子目录下所有
*.py文件按 Black 默认风格重新排版(行宽、引号、空格、括号位置等)。 - 结果:代码风格统一,再也不用人工纠结格式。
- 由于是
uv run,不需要事先安装 Black,uv 会临时在隔离环境里拉取并执行,速度极快。
② uv run ruff check .
- Ruff 是基于 Rust 的 Python 静态 linter,目标是替代 Flake8、 pylint、isort 等一堆工具。
- 这条命令会对当前目录下所有
*.py文件做秒级扫描,报出:
– 语法/语义错误(未定义变量、未使用导入…)
– 风格违规(行过长、不符合 PEP 8…)
– 潜在 Bug(未处理异常、危险默认参数…) - 支持
--fix自动修复,也可在pyproject.toml里自定义规则。
一句话总结
black负责 “把代码变漂亮”;ruff check负责 “把代码变正确”;- 两者都通过
uv run调用,无需预先安装、不污染全局、速度飞快,适合在提交前或 CI 里当门禁使用。
在正式运行前先运行上述两段代码。
代码对比
下面有两份代码,修改前与修改后,通过对比来理解相关修改处的作用。
下面为一个class中的方法,修改前:
def identify_specific_tables(
self,
documentation_file_path: str,
) -> str:
logger.info("Extract the Word standard table extraction")
doc = Document(documentation_file_path)
tables = []
for table in doc.tables:
data = []
for row in table.rows:
row_data = [cell.text.strip() for cell in row.cells]
data.append(row_data)
df = pd.DataFrame(data)
tables.append(df)
tables_str = [df.to_string() for df in tables]
prompt = f"""
以下用三个反引号分隔的是从“云南电网有限责任公司安全文明施工费使用管理标准(试行).docx”Word文档中提取的所有表格,\
Word文档提取表格集合:'''{tables_str}'''\
各个表格以DataFrame格式存储在一个列表中,遍历所有所有表格,提取出特定表格“电网工程建设安全文明施工费使用指导模板”,并输出提取出的表格,
该表格的特征如下:
1. 该表格包含['费用类型及取费建议', '措施类别及使用范围', '措施类别编码', '是否可摊销', '变电', '线路', '配网'],7列指标;
2. 其中'费用类型及取费建议'包含['安全生产费', '文明施工费', '环境保护费']三类费用信息;
注意:
- 直接返回表格信息,不要输出实现该功能的python代码;
返回说明:返回特定表格的信息,不要求文字说明。
"""
messages = [
{"role": "user", "content": prompt}
]
response = llm_client.chat(
model=LLM_MODEL,
messages=messages,
stream=False, # 不启用流式输出
)
return response.choices[0].message.content.strip()
将其单列出来作为一个class进行修改,修改后:
import logging
from typing import List
import pandas as pd
from docx import Document
from openai import OpenAI
from core.config import LLM_MODEL
from utils.logger import logger
# 如果 llm_client 已经在别处初始化,则直接导入;否则在此处初始化
# from clients.llm_client import llm_client
class DocumentationExtractor:
"""
从 Word 文档中提取并识别特定表格的通用工具类。
"""
@staticmethod
def _extract_all_tables(file_path: str) -> List[pd.DataFrame]:
"""
读取 Word 文档中的所有表格,并统一转换为 pandas.DataFrame 列表。
Args:
file_path (str): Word 文档绝对路径。
Returns:
List[pd.DataFrame]: 文档中所有表格对应的 DataFrame 列表。
"""
doc = Document(file_path)
tables: List[pd.DataFrame] = []
for table in doc.tables:
rows = [
[cell.text.strip() for cell in row.cells]
for row in table.rows
]
tables.append(pd.DataFrame(rows))
return tables
@classmethod
def identify_specific_table(
cls,
file_path: str,
*,
expected_columns: List[str],
expected_fee_types: List[str],
) -> str:
"""
识别并返回指定特征的安全文明施工费使用指导模板表格。
说明:
- 该方法为大模型调用入口,所有业务特征通过参数传入,保持通用性。
- 仅返回表格纯文本,不包含任何代码或额外说明。
Args:
file_path (str): Word 文档路径,必需为绝对路径。
expected_columns (List[str]): 目标表必须包含的列名列表。
expected_fee_types (List[str]): “费用类型及取费建议”列必须包含的费用类别列表。
Returns:
str: 符合特征的表格文本;若未匹配则返回空字符串。
"""
logger.info(
"Start extracting specific table from Word document",
extra={"file_path": file_path},
)
# 1. 提取所有表格
tables = cls._extract_all_tables(file_path)
tables_str = "\n\n".join(df.to_string(index=False) for df in tables)
# 2. 构造大模型 prompt
prompt = f"""
以下是从 Word 文档中提取的所有表格内容,已按 DataFrame 格式拼接:
{tables_str}
请依据以下规则,在所有表格中精确匹配并返回“电网工程建设安全文明施工费使用指导模板”:
规则:
1. 表格必须包含以下列(顺序无关):
{", ".join(expected_columns)}
2. “费用类型及取费建议”列必须包含以下值(顺序无关):
{", ".join(expected_fee_types)}
3. 仅返回匹配到的完整表格文本,不要附加任何解释或代码。
4. 若未匹配到,请返回空字符串。
""".strip()
messages = [{"role": "user", "content": prompt}]
# 3. 调用大模型
response = llm_client.chat.completions.create(
model=LLM_MODEL,
messages=messages,
temperature=0.0,
stream=False,
)
result = response.choices[0].message.content.strip()
logger.info("Successfully identified specific table", extra={"length": len(result)})
return result
# 使用示例
if __name__ == "__main__":
content = DocumentationExtractor.identify_specific_table(
file_path="/abs/path/云南电网有限责任公司安全文明施工费使用管理标准(试行).docx",
expected_columns=[
"费用类型及取费建议",
"措施类别及使用范围",
"措施类别编码",
"是否可摊销",
"变电",
"线路",
"配网",
],
expected_fee_types=["安全生产费", "文明施工费", "环境保护费"],
)
print(content)
修改分析
主要分为模块导入,...,对demo_class.py编写进行规范。
导入模块
核心要求是:标准库 → 第三方库 → 本地模块,各分组之间空一行,每组内部按字母序升序排列,绝对禁止 import *,class与导入模块相隔2行。
import logging
from typing import List
import pandas as pd
from docx import Document
from openai import OpenAI
from core.config import LLM_MODEL
from utils.logger import logger
注:不能一行导入多个包。
命名与可见性
主要对成员实例变量、方法、常量进行规范。前者为共有,后者为内部/私有。
- 实例变量:user_name,_user_name
- 方法:compute_total(),_compute_total()
- 常量:MAX_RETRY,_MAX_RETRY
类方法
类方法分为@staticmethod与@classmethod,前者可以理解为只是一个普通函数“借住”在类里,跟类没有任何绑定,无法访问类级别的任何信息。后者为类方法,可以访问类级别的任一信息,两者在使用时均可以用cls.method(),类名称直接点方法调用,实例方法与@classmethod属性类似,均可以访问类级别的任一信息,但是实例方法必须实例化,obj.method(),实例对象点方法调用。还有一个普通类属性,直接cls.arg调用,四者相互配合,下面以一个实际例子来展现它们之间的关系。
from __future__ import annotations
from dataclasses import dataclass, asdict
from decimal import Decimal
import datetime
@dataclass
class Order:
user_id: int
amount_cents: int # 以分为单位
status: str = "PENDING"
# ---------- 1. 实例方法:操作“这张订单” ----------
def pay(self) -> None:
if self.status != "PENDING":
raise ValueError("Only PENDING order can pay")
self.status = "PAID"
# 更新类级统计
Order._today_turnover_cents += self.amount_cents
def cancel(self) -> None:
self.status = "CANCELLED"
# ---------- 2. 类方法:工厂 + 统计 ----------
_today_turnover_cents: int = 0 # 类级属性:今日已付款总额
@classmethod
def from_json(cls, data: dict) -> Order:
"""反序列化 JSON -> Order 对象"""
return cls(
user_id=int(data["user_id"]),
amount_cents=int(data["amount_cents"]),
status=data.get("status", "PENDING")
)
@classmethod
def today_turnover_yuan(cls) -> Decimal:
"""取今日已付款总额(单位:元)"""
return Decimal(cls._today_turnover_cents) / 100
# ---------- 3. 静态方法:纯工具 ----------
@staticmethod
def cents_to_yuan(cents: int) -> Decimal:
"""分 → 元,与任何订单实例无关"""
return Decimal(cents) / 100
# ---------- 4. 普通类属性:回调 / 钩子 ----------
# 把“序列化方式”挂到类上,外部可替换(策略模式)
dump_fn = asdict
Order.dump_fn = o1
Q:什么时候选择实例方法,什么时候选择类方法?
A:当逻辑需要类级共享数据,例如,订单总数,选择类方法,否则均选择实例方法,主要有如下原因:面向对象的核心是“对象”、可扩展性更好、线程/并发更安全(类属性是全局共享的;实例属性隔离在线程各自的实例里,天然避免竞态条件。)
Q:普通类属性的作用?
A:可以对类级信息进行修改,以此通过外部替换策略模式。
cls注释规范
在class对应位置添加注释可使得cls有更好的可读性。
class Order:
"""单笔订单的业务对象.
负责状态机、金额计算与持久化。
Attributes:
order_id: 全局唯一订单号.
amount_cents: 订单金额(单位:分).
status: 订单状态,取值见 OrderStatus 枚举.
"""
def __init__(
self,
order_id: str,
items: List[str],
coupon: Optional[str] = None,
) -> None:
...
class DocumentationExtractor:
"""
从 Word 文档中提取并识别特定表格的通用工具类。
"""
@staticmethod
def _extract_all_tables(file_path: str) -> List[pd.DataFrame]:
"""
读取 Word 文档中的所有表格,并统一转换为 pandas.DataFrame 列表。
Args:
file_path (str): Word 文档绝对路径。
Returns:
List[pd.DataFrame]: 文档中所有表格对应的 DataFrame 列表。
"""
- 对于类,在正式编写之前要加入类的功能说明及公共属性说明;
- 对于类中的函数,参数要指明输入的类型,后面同时要指出输出的类型,整体格式为竖列,在正式编写之前要加入相关说明,说明主要包含三个部分,函数功能说明、参数说明、返回值说明。
提供__main__示例
自包含可运行的示例,Python 解释器启动后,会给每个模块(.py)自动设置一个全局变量__name__,如果该文件为主程序值为__main__,若该文件是被import,则值变为模块名。当文件为主程序时,运行函数下的代码,若不为主程序则忽略;
# 使用示例
if __name__ == "__main__":
content = DocumentationExtractor.identify_specific_table(
file_path="/abs/path/云南电网有限责任公司安全文明施工费使用管理标准(试行).docx",
expected_columns=[
"费用类型及取费建议",
"措施类别及使用范围",
"措施类别编码",
"是否可摊销",
"变电",
"线路",
"配网",
],
expected_fee_types=["安全生产费", "文明施工费", "环境保护费"],
)
print(content)

