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

Wikipedia-API扩展开发:如何贡献代码并添加新功能
Wikipedia-API扩展开发如何贡献代码并添加新功能【免费下载链接】Wikipedia-APIPython wrapper for Wikipedia项目地址: https://gitcode.com/gh_mirrors/wi/Wikipedia-APIWikipedia-API是一个强大的Python包装器让开发者能够轻松与维基百科数据交互。本文将为你提供一份完整指南帮助你贡献代码并添加新功能成为这个开源项目的积极参与者。为什么贡献代码参与开源项目不仅能提升你的编程技能还能为全球开发者社区做出贡献。通过为Wikipedia-API添加新功能你可以解决自己遇到的问题学习最佳实践和设计模式与志同道合的开发者建立联系丰富你的作品集准备工作在开始贡献代码之前请确保你已经完成以下步骤克隆仓库git clone https://gitcode.com/gh_mirrors/wi/Wikipedia-API阅读项目文档特别是CONTRIBUTING.rst和DEVELOPMENT.rst设置开发环境按照文档中的说明安装依赖项熟悉项目结构和代码风格理解MediaWiki查询子模块Wikipedia-API围绕MediaWiki的actionqueryAPI构建该API有两种主要类型的子模块prop子模块需要页面标题结果在raw[query][pages]中如coordinates和imageslist子模块不需要页面标题结果在raw[query][list_key]中如geosearch、random和search选择正确的子模块类型是添加新功能的第一步它将决定你的实现方式和公共方法的设计。添加新功能的步骤步骤1定义类型化数据类为子模块返回的结构化数据创建冻结的数据类确保类型安全和代码清晰。例如为coordinates子模块创建# wikipediaapi/_types.py dataclass(frozenTrue) 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(frozenTrue) class SearchParams(_BaseParams): Parameters for listsearch (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 listsearch. 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(wikiself) raw_query raw.get(query, {}) for entry in raw_query.get(search, []): p self._make_page( # ← 创建正确的页面类型 titleentry[title], nsint(entry.get(ns, 0)), languageself.language, variantself.variant, ) # 设置页面属性... pages[entry[title]] p # 提取聚合信息... return SearchResults( pagespages, totalhitsint(searchinfo.get(totalhits, 0)), suggestionsearchinfo.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(queryquery, namespacenamespace, limitlimit, sortsort) 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(queryquery, namespacenamespace, limitlimit, sortsort) 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。提交贡献当你完成新功能的实现后按照以下步骤提交贡献创建一个新的分支git checkout -b feature/your-feature-name提交你的更改git commit -m Add feature: your feature description推送到远程仓库git push origin feature/your-feature-name创建一个Pull Request (PR)等待代码审查并根据反馈进行修改结语通过遵循这个指南你可以为Wikipedia-API项目贡献有价值的功能同时提升自己的开发技能。记住开源贡献是一个协作过程不要害怕寻求帮助或反馈。无论你是添加新的MediaWiki子模块支持还是改进现有功能你的贡献都将帮助使Wikipedia-API变得更加强大和有用。开始你的贡献之旅吧【免费下载链接】Wikipedia-APIPython wrapper for Wikipedia项目地址: https://gitcode.com/gh_mirrors/wi/Wikipedia-API创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考