点我展开:基本信息

提升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. 一次典型交互流程

  1. 用户提问:“把昨晚的订单报表转成 Markdown 并发到 Slack”
  2. Host 内的 Client 向本地或远程的 MCP Server 发 JSON-RPC 请求
  3. Server 完成 SQL 查询、文件读取、格式转换、Slack API 调用等操作
  4. 结果流式返回给 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. 如何开始

  1. 装 Claude Desktop → Settings → MCP → 添加官方 mcp-servers 仓库路径
  2. 启动所需 Server(如 npx @mcp/server-filesystem ./docs
  3. 立即在对话框里让 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 &#123;"Hello": "UV"&#125;
EOF

# ④ 直接运行(无需手动激活环境)
uv run uvicorn main:app --reload
# 浏览器打开 http://127.0.0.1:8000 看到 &#123;"Hello":"UV"&#125;

整个流程 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 或官方文档即可继续进阶。祝开发愉快!

其他问题

  1. uv的基本设计逻辑。

    ​ “以声明式配置为中心,通过极致的性能实现环境的确定性。”的目标是让你感觉不到包管理器的存在,同时又保证你的代码在任何地方运行的结果都一模一样。

    uv 的设计逻辑是把 Python 环境看作一个可以随时丢弃并瞬间重建的“投影”。你只需要守护好 pyproject.toml 这个“本体”,剩下的所有繁琐工作(下载、链接、冲突解决、版本切换)都由 uv 这种 Rust 编写的引擎以毫秒级的速度完成。

  2. uv是如何通过几种文件来实现这种逻辑的?

    • 第一层:pyproject.toml:采用声明式逻辑。通常包含宽泛的版本范围。例如:requests >= 2.28.0。当你运行 uv add 时,它会修改此文件。它代表了项目的最小约束集
    • 第二层:uv.lock:记录每一个包(包括间接依赖)的精确版本(如 requests == 2.31.0)。包含依赖树的完整拓扑结构。当你运行 uv lockuv sync 时,uv 会进行复杂的数学运算(依赖解析),确保所有包互不冲突,并把结果写死在这里。
    • 第三层:.venv:包含 Python 解释器、Site-packages 文件夹、可执行脚本。
文件 谁读/写 核心价值 是否提交到 Git
pyproject.toml 开发者 / uv 定义项目需求与元数据 必须提交
uv.lock uv 自动维护 保证所有人的环境 100% 一致 强烈建议提交
.venv/ Python 解释器 物理运行空间 绝对不要提交
  1. 基本的工作流。

    • 输入命令:执行 uv add pandas

    • 修改意图uvpandas 写入 pyproject.toml

    • 计算约束uv 扫描 pyproject.toml,结合已有的 uv.lock,计算出一套不冲突的、最新的依赖方案,并更新 uv.lock

    • 物理对齐uv 根据lock文件检查当前的 .venv。如果里面少了包,就从全局缓存链接过来;如果多了包(配置里删了),就从 .venv 里移除。

  2. pyproject.toml 是从哪里来的?

    ​ 对于一个新文件夹开始项目,那直接uv init会自动生成toml文件。或者直接uv add xx这个时候发现没有toml文件,会生成该文件。toml严格保持环境的干净,它可以自动管理uv.lock,若toml未记录当前环境存在其他包,uv会删除对于的包,并严格安装toml间记录的依赖。

  3. 常见更新命令总结。

动作 命令 结果
新增包 uv add 包名 自动更新 pyproject.tomluv.lock
删除包 uv remove 包名 自动从 pyproject.toml 中移除并清理环境
升级所有包 uv lock --upgrade 保持 pyproject.toml 不变(toml文件是一个范围,例如>=0.0.2),所有包都升级到 pyproject.toml 允许范围内的最新版本。【可能出现冲突】
同步到环境 uv sync 确保 .venv 完美匹配当前的 pyproject.tomluv.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')
微调与训练 提供 TrainerMsDataset 统一接口,支持全参数、LoRA、Adapter 等多种微调策略 上传自己的数据即可微调
在线体验 网页直接上传图片/文本,实时看效果 无需写代码
部署 & Serving 一键导出为 RESTful API 或部署到阿里云 PAI、本地服务器 modelscope serve 或 Studio 发布
开放社区 开发者可上传模型、写 Notebook、讨论、点赞 类似 GitHub 的 PR/Issue 机制

2. 与「大模型」区别

  • ModelScope 是“应用商店”——容器里有很多 App(模型);
  • 通义千问、Stable Diffusion 等是“单个超级 App”——只是商店里的一个商品。

3. 典型使用场景

  1. 快速体验
    官网直接拖图片 → 秒出卡通化结果。

  2. 原型开发

    from modelscope.pipelines import pipeline
    cartoon = pipeline('image-portrait-stylization',
                         model='damo/cv_unet_person-image-cartoon')
    result = cartoon('photo.jpg')
    
  3. 微调私有数据

    from modelscope.msdatasets import MsDataset
    from modelscope.trainers import build_trainer
    ds = MsDataset.load('my_data')
    trainer = build_trainer('train_config.json')
    trainer.train()
    
  4. 生产部署

    • 导出 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文档提取表格集合:'''&#123;tables_str&#125;'''\
        各个表格以DataFrame格式存储在一个列表中,遍历所有所有表格,提取出特定表格“电网工程建设安全文明施工费使用指导模板”,并输出提取出的表格,
        该表格的特征如下:

        1. 该表格包含['费用类型及取费建议', '措施类别及使用范围', '措施类别编码', '是否可摊销', '变电', '线路', '配网'],7列指标;
        2. 其中'费用类型及取费建议'包含['安全生产费', '文明施工费', '环境保护费']三类费用信息;

        注意:
        - 直接返回表格信息,不要输出实现该功能的python代码;

        返回说明:返回特定表格的信息,不要求文字说明。
        """

        messages = [
            &#123;"role": "user", "content": prompt&#125;
        ]
        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=&#123;"file_path": file_path&#125;,
        )

        # 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 格式拼接:

&#123;tables_str&#125;

请依据以下规则,在所有表格中精确匹配并返回“电网工程建设安全文明施工费使用指导模板”:

规则:
1. 表格必须包含以下列(顺序无关):
   &#123;", ".join(expected_columns)&#125;
2. “费用类型及取费建议”列必须包含以下值(顺序无关):
   &#123;", ".join(expected_fee_types)&#125;
3. 仅返回匹配到的完整表格文本,不要附加任何解释或代码。
4. 若未匹配到,请返回空字符串。
""".strip()

        messages = [&#123;"role": "user", "content": prompt&#125;]

        # 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=&#123;"length": len(result)&#125;)
        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 列表。
        """
  1. 对于类,在正式编写之前要加入类的功能说明及公共属性说明;
  2. 对于类中的函数,参数要指明输入的类型,后面同时要指出输出的类型,整体格式为竖列,在正式编写之前要加入相关说明,说明主要包含三个部分,函数功能说明、参数说明、返回值说明。

提供__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)

SZUer继续加油!