news 2026/7/28 6:58:31

Wikipedia-API扩展开发:如何贡献代码并添加新功能

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Wikipedia-API扩展开发:如何贡献代码并添加新功能

Wikipedia-API扩展开发:如何贡献代码并添加新功能

【免费下载链接】Wikipedia-APIPython wrapper for Wikipedia项目地址: https://gitcode.com/gh_mirrors/wi/Wikipedia-API

Wikipedia-API是一个强大的Python包装器,让开发者能够轻松与维基百科数据交互。本文将为你提供一份完整指南,帮助你贡献代码并添加新功能,成为这个开源项目的积极参与者。

为什么贡献代码?

参与开源项目不仅能提升你的编程技能,还能为全球开发者社区做出贡献。通过为Wikipedia-API添加新功能,你可以:

  • 解决自己遇到的问题
  • 学习最佳实践和设计模式
  • 与志同道合的开发者建立联系
  • 丰富你的作品集

准备工作

在开始贡献代码之前,请确保你已经完成以下步骤:

  1. 克隆仓库:git clone https://gitcode.com/gh_mirrors/wi/Wikipedia-API
  2. 阅读项目文档,特别是CONTRIBUTING.rst和DEVELOPMENT.rst
  3. 设置开发环境:按照文档中的说明安装依赖项
  4. 熟悉项目结构和代码风格

理解MediaWiki查询子模块

Wikipedia-API围绕MediaWiki的action=queryAPI构建,该API有两种主要类型的子模块:

  • prop=子模块:需要页面标题,结果在raw["query"]["pages"]中,如coordinatesimages
  • list=子模块:不需要页面标题,结果在raw["query"][list_key]中,如geosearchrandomsearch

选择正确的子模块类型是添加新功能的第一步,它将决定你的实现方式和公共方法的设计。

添加新功能的步骤

步骤1:定义类型化数据类

为子模块返回的结构化数据创建冻结的数据类,确保类型安全和代码清晰。例如,为coordinates子模块创建:

# wikipediaapi/_types.py @dataclass(frozen=True) class Coordinate: """A single geographic coordinate associated with a Wikipedia page.""" lat: float lon: float primary: bool globe: str = "earth" # 其他字段...

步骤2:定义参数数据类

创建一个冻结的数据类,将Python参数映射到MediaWiki API参数。例如,为search子模块:

# wikipediaapi/_params.py @dataclass(frozen=True) class SearchParams(_BaseParams): """Parameters for list=search (prefix sr).""" query: str = "" namespace: int = 0 limit: int = 10 sort: str = "relevance" PREFIX: ClassVar[str] = "sr" FIELD_MAP: ClassVar[dict[str, str]] = { "query": "search", # → srsearch "namespace": "namespace", # → srnamespace # 其他映射... }

步骤3:添加API参数构建器

BaseWikipediaResource类中添加方法,构建原始API参数字典。例如:

# wikipediaapi/_resources/base_wikipedia_resource.py def _search_api_params(self, params: SearchParams) -> dict[str, Any]: """Build API params for list=search.""" api_params: dict[str, Any] = { "action": "query", "list": "search", # ← 独立列表,不需要页面标题 } api_params.update(params.to_api()) return api_params

步骤4:添加响应解析器

实现解析原始JSON响应到类型化数据类的方法。例如,解析搜索结果:

# wikipediaapi/_resources/base_wikipedia_resource.py def _build_search_results(self, raw: dict[str, Any]) -> SearchResults: """Parse search list results into a SearchResults wrapper.""" pages = PagesDict(wiki=self) raw_query = raw.get("query", {}) for entry in raw_query.get("search", []): p = self._make_page( # ← 创建正确的页面类型 title=entry["title"], ns=int(entry.get("ns", 0)), language=self.language, variant=self.variant, ) # 设置页面属性... pages[entry["title"]] = p # 提取聚合信息... return SearchResults( pages=pages, totalhits=int(searchinfo.get("totalhits", 0)), suggestion=searchinfo.get("suggestion"), )

步骤5和6:添加同步和异步公共方法

为同步和异步API添加公共方法。确保两者具有相同的签名,只在调度调用上有所不同(self._get(...)vsawait self._get(...))。

# wikipediaapi/_resources/wikipedia_resource.py (同步) def search( self, query: str, *, namespace: int = 0, limit: int = 10, sort: str = "relevance", ) -> SearchResults: """Search Wikipedia for pages matching a query.""" params = SearchParams(query=query, namespace=namespace, limit=limit, sort=sort) api_params = self._search_api_params(params) raw = self._get(self.language, self._construct_params_standalone(api_params)) return self._build_search_results(raw)
# wikipediaapi/_resources/async_wikipedia_resource.py (异步) async def search( self, query: str, *, namespace: int = 0, limit: int = 10, sort: str = "relevance", ) -> SearchResults: """Async: Search Wikipedia for pages matching a query.""" params = SearchParams(query=query, namespace=namespace, limit=limit, sort=sort) api_params = self._search_api_params(params) raw = await self._get(self.language, self._construct_params_standalone(api_params)) return self._build_search_results(raw)

步骤7:添加页面属性

prop=子模块添加页面属性,使数据访问更加直观。同步和异步属性有不同的实现方式:

# wikipediaapi/_page/wikipedia_page.py (同步) @property def coordinates(self) -> list[Coordinate]: """Geographic coordinates for this page.""" default_params = CoordinatesParams() cached = self._get_cached("coordinates", default_params.cache_key()) if isinstance(cached, type(NOT_CACHED)): self.wiki.coordinates(self) # ← 触发获取 cached = self._get_cached("coordinates", default_params.cache_key()) if isinstance(cached, type(NOT_CACHED)): return [] return cached
# wikipediaapi/_page/async_wikipedia_page.py (异步) @property def coordinates(self) -> Any: """Awaitable: geographic coordinates for this page.""" async def _get() -> list[Coordinate]: default_params = CoordinatesParams() cached = self._get_cached("coordinates", default_params.cache_key()) if isinstance(cached, type(NOT_CACHED)): await self.wiki.coordinates(self) # ← await cached = self._get_cached("coordinates", default_params.cache_key()) if isinstance(cached, type(NOT_CACHED)): return [] return cached return _get() # ← 返回协程,而不是结果

步骤8-13:完善实现

完成剩下的步骤,包括更新页面初始化、导出类型、添加模拟数据、编写测试、更新文档和运行质量检查。详细指南请参考ADDING_SUBMODULES.md。

提交贡献

当你完成新功能的实现后,按照以下步骤提交贡献:

  1. 创建一个新的分支:git checkout -b feature/your-feature-name
  2. 提交你的更改:git commit -m "Add feature: your feature description"
  3. 推送到远程仓库:git push origin feature/your-feature-name
  4. 创建一个Pull Request (PR)
  5. 等待代码审查并根据反馈进行修改

结语

通过遵循这个指南,你可以为Wikipedia-API项目贡献有价值的功能,同时提升自己的开发技能。记住,开源贡献是一个协作过程,不要害怕寻求帮助或反馈。

无论你是添加新的MediaWiki子模块支持,还是改进现有功能,你的贡献都将帮助使Wikipedia-API变得更加强大和有用。开始你的贡献之旅吧!

【免费下载链接】Wikipedia-APIPython wrapper for Wikipedia项目地址: https://gitcode.com/gh_mirrors/wi/Wikipedia-API

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/28 6:58:05

TileLang:基于Python的GPU内核开发DSL,简化高性能计算编程

如果你正在为GPU编程的复杂性头疼——既要理解CUDA的线程模型,又要手动优化内存访问,还要处理各种硬件特性——那么TileLang可能正是你需要的解决方案。这个基于Python的领域特定语言(DSL)正在改变高性能GPU内核的开发方式。它最大…

作者头像 李华
网站建设 2026/7/28 6:53:59

空调关机误区与科学养护指南:省电、延寿、防故障全解析

1. 从“空调关关”说起:一个被忽视的日常习惯最近在社交媒体上,一个看似简单的词条“空调关关”悄然走红。乍一看,这像是一个口误或者叠词卖萌,但仔细琢磨,它精准地戳中了许多人,尤其是租房一族和精打细算的…

作者头像 李华
网站建设 2026/7/28 6:51:43

Java后端工程师求职指南:从技术栈梳理到简历优化与面试突破

最近几年,“Java已死”的论调时不时就会冒出来,尤其是在一些新兴语言快速发展的背景下。但现实是,Java后端开发岗位依然海量,薪资天花板也足够高。问题往往不在于语言本身,而在于求职者自身的技术栈与市场需求的错配。…

作者头像 李华
网站建设 2026/7/28 6:49:28

gh_mirrors/dht1/dht实战教程:基于dht-example.c构建自己的DHT节点

gh_mirrors/dht1/dht实战教程:基于dht-example.c构建自己的DHT节点 【免费下载链接】dht BitTorrent DHT library 项目地址: https://gitcode.com/gh_mirrors/dht1/dht BitTorrent DHT library(分布式哈希表)是P2P网络中的核心组件&am…

作者头像 李华
网站建设 2026/7/28 6:48:45

从RAG到AI Agent:构建生产级可信智能体的工程化实践

这次我们来看一个工程化 Agentic RAG 系统的构建思路。它不是一个可以直接下载的软件包,而是一套将传统 RAG(检索增强生成)升级为具备自主决策和行动能力的智能体(AI Agent)的方法论。核心目标很明确:让 AI 不仅能回答基于文档的问题,还能主动调用外部工具(如 Google S…

作者头像 李华
网站建设 2026/7/28 6:46:12

AI生成教材的质量管控与优化实践

1. 项目概述:AI教材编写面临的真实挑战去年我接手了一个教育科技公司的项目,他们希望用AI生成一套编程入门教材。最初团队信心满满,认为用GPT-4这类大语言模型几天就能搞定,结果第一版内容差点酿成教学事故——查重率高达62%&…

作者头像 李华