ulang


Nameulang JSON
Version 0.1.5 PyPI version JSON
download
home_pageNone
Summary木兰编程语言重现
upload_time2024-03-25 23:00:16
maintainerNone
docs_urlNone
authorNone
requires_python<3.10,>=3.7
licenseGNU GPLv3
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            [![木兰在线版](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/git/https%3A%2F%2Fgitee.com%2FMulanRevive%2Fmulan-rework/HEAD)
[![所有测试](https://github.com/MulanRevive/mulan-rework/actions/workflows/pipeline-20220810.yml/badge.svg)](https://github.com/MulanRevive/mulan-rework/actions/workflows/pipeline-20220810.yml)

## 前言

没错,这就是那个木兰。

2020 年一月第一时间提出知乎问题[「木兰」编程语言有什么特色?](https://www.zhihu.com/question/366509495)的正是本人,[这是那段暴风骤雨的亲历记](https://zhuanlan.zhihu.com/p/265091649)。

## 目标

[悬赏完成之前](https://zhuanlan.zhihu.com/p/224600854),将努力向[重现「木兰」编程语言的目标](https://gitee.com/MulanRevive/bounty/blob/master/%E5%A4%8D%E7%8E%B0%E6%96%87%E6%A1%A3/README.md)迈进。系列技术文章集结在[知乎专栏](https://zhuanlan.zhihu.com/ulang)并在[开源中国](https://www.oschina.net/p/mulan-rework)同步更新,部分文章将发到 [国产语言论坛木兰主题](https://zh-lang.osanswer.net/c/mulan/10)。

## IDE 辅助

[VS Code 语法高亮插件](https://marketplace.visualstudio.com/items?itemName=CodeInChinese.ulang):

![vsc截图](https://gitee.com/MulanRevive/ide-extension-vscode/raw/master/%E6%88%AA%E5%9B%BE/2021-01-20_%E4%B8%80%E5%B2%81.png)

【原型】[自带在线编辑器](https://gitee.com/MulanRevive/mulan-rework/tree/master/编辑器):

![自带IDE截图](https://gitee.com/MulanRevive/bounty/raw/master/%E8%BF%9B%E5%B1%95%E5%B0%8F%E7%BB%93/%E6%88%AA%E5%9B%BE/2021-01-20_%E5%9C%A8%E7%BA%BF.png)

### 运行木兰源码文件

`$ 木兰 测试/手工测试/草蟒_海龟.ul` 运行如下调用了 [草蟒](https://www.oschina.net/p/grasspy) 中文 API 的 [例程](https://gitee.com/MulanRevive/mulan-rework/tree/master/测试/手工测试/草蟒_海龟.ul):

```javascript
using * in 海龟

颜色("黄色", "红色")
开始填充()
for 转角 in 0..4 {
  前进(200); 右转(144)
}
结束填充()
主循环()
/* 需安装 Python 库“草蟒”: grasspy-modules */
```

### 中文报错信息

交互环境中仅提示出错所在位置简要信息:

```javascript
> func a(n) { return n1+1 }
> func b(n) { print(n) }
> b(a(2))
 😰 请先定义'n1'再使用, 见第1行
```

运行源码时,可见调用各层的详细信息。如果错误发生在其他文件,可见文件名:

```terminal
$ 木兰 测试/错误处理/引用模块.ul
 😰 取列表内容时,索引超出范围
“测试/错误处理/下标越界函数.ul”第2行:print([][0])
调用层级如下
见第3行:a()
```

## 参考例程[在此](https://gitee.com/MulanRevive/mulan-rework/tree/master/测试)

其中 [实用](https://gitee.com/MulanRevive/mulan-rework/tree/master/测试/实用) 为较接近实用的部分。另外 [木兰代码编辑器](https://gitee.com/MulanRevive/mulan-rework/tree/master/编辑器) 也用木兰代码编写。

所有例程演示的语法可用原始的木兰可执行文件 [ulang-0.2.2.exe](https://gitee.com/MulanRevive/bounty/tree/master/%E5%8E%9F%E5%A7%8B%E8%B5%84%E6%96%99/%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6) 检验。***如发现有异烦请告知,[长期悬赏在此](https://gitee.com/MulanRevive/mulan-rework/issues/I6B8GO)。***

## 功能说明

随着逐渐缩小 [与原版木兰的差距](https://gitee.com/MulanRevive/mulan-rework/issues/I1SEU5),将完善 [语法说明](文档/语法说明.md)。用户手册 [尚待更新](https://gitee.com/MulanRevive/mulan-rework/issues/I1U36D)。为调试方便,报错等等反馈信息会[逐渐中文化](https://zhuanlan.zhihu.com/p/148065426)。

### 试用发布版

***必需 Python 3.7 ~ 3.9,源码文件需 UTF-8 编码***,`pip install ulang` 安装木兰。

### 命令行交互环境

```terminal
$ 木兰
木兰向您问好
更多信息请说'你好'
> 和 = 0
> for 数 in 1..10 {
>> 和 += 数
>> }
> 和
55
```

功能说明 [在此](https://gitee.com/MulanRevive/mulan-rework/tree/master/文档/功能/交互环境.md)。

### binder 在线环境

New -> Terminal 打开命令行,同样输入“木兰”运行

### 新手入门

无编程经验不打紧,[请入此门](https://gitee.com/MulanRevive/mulan-rework/tree/master/文档/用户手册/编程新手/1猜数字.md)。

## 参与开发

### 实现简介

木兰源代码转换为 Python 的中间表示(AST)后执行,可实现各种语法设计与周边功能,并可方便地利用 Python 现有生态。

新手开发者请看[开发流程与项目结构简介](文档/开发上手.md)。

使用 Python 3.7 ~3.9 的最新小版本。Mac、[Linux](https://gitee.com/MulanRevive/mulan-rework/issues/I1U9O3)、[Windows](https://gitee.com/MulanRevive/mulan-rework/issues/I1U2HP) 下全部测试通过。

为提高开发维护效率,本项目中尽量使用中文标识符。包括语法规则、Python 代码等等。

木兰语言部分依赖的第三方 Python 包:

- [rply-ulang](https://pypi.org/project/rply-ulang/)
- [codegen](https://pypi.org/project/codegen/)

### 本地运行

```terminal
$ python -m 木兰
木兰向您问好
更多信息请说'你好'
>
```

### 运行测试

1. 重现项目自身测试

```shell
python -m unittest 测试.unittest.交互 测试.unittest.语法树 测试.unittest.所有用例 测试.unittest.报错 测试.unittest.Python到木兰
```

2. 原始木兰可执行文件测试

以下为检验[与原始木兰可执行文件功能一致](https://zhuanlan.zhihu.com/p/230155471),在 Windows 下需将 [ulang-0.2.2.exe](https://gitee.com/MulanRevive/bounty/tree/master/%E5%8E%9F%E5%A7%8B%E8%B5%84%E6%96%99/%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6) 置于项目根目录。

以下测试语法相关用例。Windows 系统下会使用 木兰原始可执行文件(`ulang-0.2.2.exe`)测试,其他系统下则会使用 Python 安装的`木兰`进行测试:

```shell
python 测试/运行所有.py
```

以下测试源码生成相关用例:

```shell
python -m unittest 测试.unittest.原始可执行文件
```

以下测试木兰源码转换为 Python:

```shell
python -m unittest 测试.unittest.木兰到Python
```

## 许可证

GNU GPLv3

## [版本历史介绍](CHANGELOG.md)

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "ulang",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<3.10,>=3.7",
    "maintainer_email": null,
    "keywords": null,
    "author": null,
    "author_email": "\u5434\u70dc <mulanrevive@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/b9/54/8e5bf12f9aed89086c3a340b8149a608ad0178c3f8a29ff6630d0071e814/ulang-0.1.5.tar.gz",
    "platform": null,
    "description": "[![\u6728\u5170\u5728\u7ebf\u7248](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/git/https%3A%2F%2Fgitee.com%2FMulanRevive%2Fmulan-rework/HEAD)\r\n[![\u6240\u6709\u6d4b\u8bd5](https://github.com/MulanRevive/mulan-rework/actions/workflows/pipeline-20220810.yml/badge.svg)](https://github.com/MulanRevive/mulan-rework/actions/workflows/pipeline-20220810.yml)\r\n\r\n## \u524d\u8a00\r\n\r\n\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u90a3\u4e2a\u6728\u5170\u3002\r\n\r\n2020 \u5e74\u4e00\u6708\u7b2c\u4e00\u65f6\u95f4\u63d0\u51fa\u77e5\u4e4e\u95ee\u9898[\u300c\u6728\u5170\u300d\u7f16\u7a0b\u8bed\u8a00\u6709\u4ec0\u4e48\u7279\u8272\uff1f](https://www.zhihu.com/question/366509495)\u7684\u6b63\u662f\u672c\u4eba\uff0c[\u8fd9\u662f\u90a3\u6bb5\u66b4\u98ce\u9aa4\u96e8\u7684\u4eb2\u5386\u8bb0](https://zhuanlan.zhihu.com/p/265091649)\u3002\r\n\r\n## \u76ee\u6807\r\n\r\n[\u60ac\u8d4f\u5b8c\u6210\u4e4b\u524d](https://zhuanlan.zhihu.com/p/224600854)\uff0c\u5c06\u52aa\u529b\u5411[\u91cd\u73b0\u300c\u6728\u5170\u300d\u7f16\u7a0b\u8bed\u8a00\u7684\u76ee\u6807](https://gitee.com/MulanRevive/bounty/blob/master/%E5%A4%8D%E7%8E%B0%E6%96%87%E6%A1%A3/README.md)\u8fc8\u8fdb\u3002\u7cfb\u5217\u6280\u672f\u6587\u7ae0\u96c6\u7ed3\u5728[\u77e5\u4e4e\u4e13\u680f](https://zhuanlan.zhihu.com/ulang)\u5e76\u5728[\u5f00\u6e90\u4e2d\u56fd](https://www.oschina.net/p/mulan-rework)\u540c\u6b65\u66f4\u65b0\uff0c\u90e8\u5206\u6587\u7ae0\u5c06\u53d1\u5230 [\u56fd\u4ea7\u8bed\u8a00\u8bba\u575b\u6728\u5170\u4e3b\u9898](https://zh-lang.osanswer.net/c/mulan/10)\u3002\r\n\r\n## IDE \u8f85\u52a9\r\n\r\n[VS Code \u8bed\u6cd5\u9ad8\u4eae\u63d2\u4ef6](https://marketplace.visualstudio.com/items?itemName=CodeInChinese.ulang)\uff1a\r\n\r\n![vsc\u622a\u56fe](https://gitee.com/MulanRevive/ide-extension-vscode/raw/master/%E6%88%AA%E5%9B%BE/2021-01-20_%E4%B8%80%E5%B2%81.png)\r\n\r\n\u3010\u539f\u578b\u3011[\u81ea\u5e26\u5728\u7ebf\u7f16\u8f91\u5668](https://gitee.com/MulanRevive/mulan-rework/tree/master/\u7f16\u8f91\u5668)\uff1a\r\n\r\n![\u81ea\u5e26IDE\u622a\u56fe](https://gitee.com/MulanRevive/bounty/raw/master/%E8%BF%9B%E5%B1%95%E5%B0%8F%E7%BB%93/%E6%88%AA%E5%9B%BE/2021-01-20_%E5%9C%A8%E7%BA%BF.png)\r\n\r\n### \u8fd0\u884c\u6728\u5170\u6e90\u7801\u6587\u4ef6\r\n\r\n`$ \u6728\u5170 \u6d4b\u8bd5/\u624b\u5de5\u6d4b\u8bd5/\u8349\u87d2_\u6d77\u9f9f.ul` \u8fd0\u884c\u5982\u4e0b\u8c03\u7528\u4e86 [\u8349\u87d2](https://www.oschina.net/p/grasspy) \u4e2d\u6587 API \u7684 [\u4f8b\u7a0b](https://gitee.com/MulanRevive/mulan-rework/tree/master/\u6d4b\u8bd5/\u624b\u5de5\u6d4b\u8bd5/\u8349\u87d2_\u6d77\u9f9f.ul)\uff1a\r\n\r\n```javascript\r\nusing * in \u6d77\u9f9f\r\n\r\n\u989c\u8272(\"\u9ec4\u8272\", \"\u7ea2\u8272\")\r\n\u5f00\u59cb\u586b\u5145()\r\nfor \u8f6c\u89d2 in 0..4 {\r\n  \u524d\u8fdb(200); \u53f3\u8f6c(144)\r\n}\r\n\u7ed3\u675f\u586b\u5145()\r\n\u4e3b\u5faa\u73af()\r\n/* \u9700\u5b89\u88c5 Python \u5e93\u201c\u8349\u87d2\u201d\uff1a grasspy-modules */\r\n```\r\n\r\n### \u4e2d\u6587\u62a5\u9519\u4fe1\u606f\r\n\r\n\u4ea4\u4e92\u73af\u5883\u4e2d\u4ec5\u63d0\u793a\u51fa\u9519\u6240\u5728\u4f4d\u7f6e\u7b80\u8981\u4fe1\u606f\uff1a\r\n\r\n```javascript\r\n> func a(n) { return n1+1 }\r\n> func b(n) { print(n) }\r\n> b(a(2))\r\n \ud83d\ude30 \u8bf7\u5148\u5b9a\u4e49'n1'\u518d\u4f7f\u7528, \u89c1\u7b2c1\u884c\r\n```\r\n\r\n\u8fd0\u884c\u6e90\u7801\u65f6\uff0c\u53ef\u89c1\u8c03\u7528\u5404\u5c42\u7684\u8be6\u7ec6\u4fe1\u606f\u3002\u5982\u679c\u9519\u8bef\u53d1\u751f\u5728\u5176\u4ed6\u6587\u4ef6\uff0c\u53ef\u89c1\u6587\u4ef6\u540d\uff1a\r\n\r\n```terminal\r\n$ \u6728\u5170 \u6d4b\u8bd5/\u9519\u8bef\u5904\u7406/\u5f15\u7528\u6a21\u5757.ul\r\n \ud83d\ude30 \u53d6\u5217\u8868\u5185\u5bb9\u65f6\uff0c\u7d22\u5f15\u8d85\u51fa\u8303\u56f4\r\n\u201c\u6d4b\u8bd5/\u9519\u8bef\u5904\u7406/\u4e0b\u6807\u8d8a\u754c\u51fd\u6570.ul\u201d\u7b2c2\u884c\uff1aprint([][0])\r\n\u8c03\u7528\u5c42\u7ea7\u5982\u4e0b\r\n\u89c1\u7b2c3\u884c\uff1aa()\r\n```\r\n\r\n## \u53c2\u8003\u4f8b\u7a0b[\u5728\u6b64](https://gitee.com/MulanRevive/mulan-rework/tree/master/\u6d4b\u8bd5)\r\n\r\n\u5176\u4e2d [\u5b9e\u7528](https://gitee.com/MulanRevive/mulan-rework/tree/master/\u6d4b\u8bd5/\u5b9e\u7528) \u4e3a\u8f83\u63a5\u8fd1\u5b9e\u7528\u7684\u90e8\u5206\u3002\u53e6\u5916 [\u6728\u5170\u4ee3\u7801\u7f16\u8f91\u5668](https://gitee.com/MulanRevive/mulan-rework/tree/master/\u7f16\u8f91\u5668) \u4e5f\u7528\u6728\u5170\u4ee3\u7801\u7f16\u5199\u3002\r\n\r\n\u6240\u6709\u4f8b\u7a0b\u6f14\u793a\u7684\u8bed\u6cd5\u53ef\u7528\u539f\u59cb\u7684\u6728\u5170\u53ef\u6267\u884c\u6587\u4ef6 [ulang-0.2.2.exe](https://gitee.com/MulanRevive/bounty/tree/master/%E5%8E%9F%E5%A7%8B%E8%B5%84%E6%96%99/%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6) \u68c0\u9a8c\u3002***\u5982\u53d1\u73b0\u6709\u5f02\u70e6\u8bf7\u544a\u77e5\uff0c[\u957f\u671f\u60ac\u8d4f\u5728\u6b64](https://gitee.com/MulanRevive/mulan-rework/issues/I6B8GO)\u3002***\r\n\r\n## \u529f\u80fd\u8bf4\u660e\r\n\r\n\u968f\u7740\u9010\u6e10\u7f29\u5c0f [\u4e0e\u539f\u7248\u6728\u5170\u7684\u5dee\u8ddd](https://gitee.com/MulanRevive/mulan-rework/issues/I1SEU5)\uff0c\u5c06\u5b8c\u5584 [\u8bed\u6cd5\u8bf4\u660e](\u6587\u6863/\u8bed\u6cd5\u8bf4\u660e.md)\u3002\u7528\u6237\u624b\u518c [\u5c1a\u5f85\u66f4\u65b0](https://gitee.com/MulanRevive/mulan-rework/issues/I1U36D)\u3002\u4e3a\u8c03\u8bd5\u65b9\u4fbf\uff0c\u62a5\u9519\u7b49\u7b49\u53cd\u9988\u4fe1\u606f\u4f1a[\u9010\u6e10\u4e2d\u6587\u5316](https://zhuanlan.zhihu.com/p/148065426)\u3002\r\n\r\n### \u8bd5\u7528\u53d1\u5e03\u7248\r\n\r\n***\u5fc5\u9700 Python 3.7 ~ 3.9\uff0c\u6e90\u7801\u6587\u4ef6\u9700 UTF-8 \u7f16\u7801***\uff0c`pip install ulang` \u5b89\u88c5\u6728\u5170\u3002\r\n\r\n### \u547d\u4ee4\u884c\u4ea4\u4e92\u73af\u5883\r\n\r\n```terminal\r\n$ \u6728\u5170\r\n\u6728\u5170\u5411\u60a8\u95ee\u597d\r\n\u66f4\u591a\u4fe1\u606f\u8bf7\u8bf4'\u4f60\u597d'\r\n> \u548c = 0\r\n> for \u6570 in 1..10 {\r\n>> \u548c += \u6570\r\n>> }\r\n> \u548c\r\n55\r\n```\r\n\r\n\u529f\u80fd\u8bf4\u660e [\u5728\u6b64](https://gitee.com/MulanRevive/mulan-rework/tree/master/\u6587\u6863/\u529f\u80fd/\u4ea4\u4e92\u73af\u5883.md)\u3002\r\n\r\n### binder \u5728\u7ebf\u73af\u5883\r\n\r\nNew -> Terminal \u6253\u5f00\u547d\u4ee4\u884c\uff0c\u540c\u6837\u8f93\u5165\u201c\u6728\u5170\u201d\u8fd0\u884c\r\n\r\n### \u65b0\u624b\u5165\u95e8\r\n\r\n\u65e0\u7f16\u7a0b\u7ecf\u9a8c\u4e0d\u6253\u7d27\uff0c[\u8bf7\u5165\u6b64\u95e8](https://gitee.com/MulanRevive/mulan-rework/tree/master/\u6587\u6863/\u7528\u6237\u624b\u518c/\u7f16\u7a0b\u65b0\u624b/1\u731c\u6570\u5b57.md)\u3002\r\n\r\n## \u53c2\u4e0e\u5f00\u53d1\r\n\r\n### \u5b9e\u73b0\u7b80\u4ecb\r\n\r\n\u6728\u5170\u6e90\u4ee3\u7801\u8f6c\u6362\u4e3a Python \u7684\u4e2d\u95f4\u8868\u793a\uff08AST\uff09\u540e\u6267\u884c\uff0c\u53ef\u5b9e\u73b0\u5404\u79cd\u8bed\u6cd5\u8bbe\u8ba1\u4e0e\u5468\u8fb9\u529f\u80fd\uff0c\u5e76\u53ef\u65b9\u4fbf\u5730\u5229\u7528 Python \u73b0\u6709\u751f\u6001\u3002\r\n\r\n\u65b0\u624b\u5f00\u53d1\u8005\u8bf7\u770b[\u5f00\u53d1\u6d41\u7a0b\u4e0e\u9879\u76ee\u7ed3\u6784\u7b80\u4ecb](\u6587\u6863/\u5f00\u53d1\u4e0a\u624b.md)\u3002\r\n\r\n\u4f7f\u7528 Python 3.7 ~3.9 \u7684\u6700\u65b0\u5c0f\u7248\u672c\u3002Mac\u3001[Linux](https://gitee.com/MulanRevive/mulan-rework/issues/I1U9O3)\u3001[Windows](https://gitee.com/MulanRevive/mulan-rework/issues/I1U2HP) \u4e0b\u5168\u90e8\u6d4b\u8bd5\u901a\u8fc7\u3002\r\n\r\n\u4e3a\u63d0\u9ad8\u5f00\u53d1\u7ef4\u62a4\u6548\u7387\uff0c\u672c\u9879\u76ee\u4e2d\u5c3d\u91cf\u4f7f\u7528\u4e2d\u6587\u6807\u8bc6\u7b26\u3002\u5305\u62ec\u8bed\u6cd5\u89c4\u5219\u3001Python \u4ee3\u7801\u7b49\u7b49\u3002\r\n\r\n\u6728\u5170\u8bed\u8a00\u90e8\u5206\u4f9d\u8d56\u7684\u7b2c\u4e09\u65b9 Python \u5305\uff1a\r\n\r\n- [rply-ulang](https://pypi.org/project/rply-ulang/)\r\n- [codegen](https://pypi.org/project/codegen/)\r\n\r\n### \u672c\u5730\u8fd0\u884c\r\n\r\n```terminal\r\n$ python -m \u6728\u5170\r\n\u6728\u5170\u5411\u60a8\u95ee\u597d\r\n\u66f4\u591a\u4fe1\u606f\u8bf7\u8bf4'\u4f60\u597d'\r\n>\r\n```\r\n\r\n### \u8fd0\u884c\u6d4b\u8bd5\r\n\r\n1. \u91cd\u73b0\u9879\u76ee\u81ea\u8eab\u6d4b\u8bd5\r\n\r\n```shell\r\npython -m unittest \u6d4b\u8bd5.unittest.\u4ea4\u4e92 \u6d4b\u8bd5.unittest.\u8bed\u6cd5\u6811 \u6d4b\u8bd5.unittest.\u6240\u6709\u7528\u4f8b \u6d4b\u8bd5.unittest.\u62a5\u9519 \u6d4b\u8bd5.unittest.Python\u5230\u6728\u5170\r\n```\r\n\r\n2. \u539f\u59cb\u6728\u5170\u53ef\u6267\u884c\u6587\u4ef6\u6d4b\u8bd5\r\n\r\n\u4ee5\u4e0b\u4e3a\u68c0\u9a8c[\u4e0e\u539f\u59cb\u6728\u5170\u53ef\u6267\u884c\u6587\u4ef6\u529f\u80fd\u4e00\u81f4](https://zhuanlan.zhihu.com/p/230155471)\uff0c\u5728 Windows \u4e0b\u9700\u5c06 [ulang-0.2.2.exe](https://gitee.com/MulanRevive/bounty/tree/master/%E5%8E%9F%E5%A7%8B%E8%B5%84%E6%96%99/%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6) \u7f6e\u4e8e\u9879\u76ee\u6839\u76ee\u5f55\u3002\r\n\r\n\u4ee5\u4e0b\u6d4b\u8bd5\u8bed\u6cd5\u76f8\u5173\u7528\u4f8b\u3002Windows \u7cfb\u7edf\u4e0b\u4f1a\u4f7f\u7528 \u6728\u5170\u539f\u59cb\u53ef\u6267\u884c\u6587\u4ef6\uff08`ulang-0.2.2.exe`\uff09\u6d4b\u8bd5\uff0c\u5176\u4ed6\u7cfb\u7edf\u4e0b\u5219\u4f1a\u4f7f\u7528 Python \u5b89\u88c5\u7684`\u6728\u5170`\u8fdb\u884c\u6d4b\u8bd5\uff1a\r\n\r\n```shell\r\npython \u6d4b\u8bd5/\u8fd0\u884c\u6240\u6709.py\r\n```\r\n\r\n\u4ee5\u4e0b\u6d4b\u8bd5\u6e90\u7801\u751f\u6210\u76f8\u5173\u7528\u4f8b\uff1a\r\n\r\n```shell\r\npython -m unittest \u6d4b\u8bd5.unittest.\u539f\u59cb\u53ef\u6267\u884c\u6587\u4ef6\r\n```\r\n\r\n\u4ee5\u4e0b\u6d4b\u8bd5\u6728\u5170\u6e90\u7801\u8f6c\u6362\u4e3a Python\uff1a\r\n\r\n```shell\r\npython -m unittest \u6d4b\u8bd5.unittest.\u6728\u5170\u5230Python\r\n```\r\n\r\n## \u8bb8\u53ef\u8bc1\r\n\r\nGNU GPLv3\r\n\r\n## [\u7248\u672c\u5386\u53f2\u4ecb\u7ecd](CHANGELOG.md)\r\n",
    "bugtrack_url": null,
    "license": "GNU GPLv3",
    "summary": "\u6728\u5170\u7f16\u7a0b\u8bed\u8a00\u91cd\u73b0",
    "version": "0.1.5",
    "project_urls": {
        "Changelog": "https://gitee.com/MulanRevive/mulan-rework#\u7248\u672c\u5386\u53f2\u4ecb\u7ecd",
        "Homepage": "https://www.oschina.net/p/mulan-rework",
        "Source": "https://gitee.com/MulanRevive/mulan-rework"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2d17156db295b3b18bff559bb7b8dad62bdc2e599df239e1596438bb688ccf43",
                "md5": "d504ad74a22e96706e73612d0bc20013",
                "sha256": "acefcfba8585ac75fe4e3e846e1c4bf2090e8e532d6d3d2ebcf10daa447a7504"
            },
            "downloads": -1,
            "filename": "ulang-0.1.5-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "d504ad74a22e96706e73612d0bc20013",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<3.10,>=3.7",
            "size": 53999,
            "upload_time": "2024-03-25T23:00:12",
            "upload_time_iso_8601": "2024-03-25T23:00:12.989458Z",
            "url": "https://files.pythonhosted.org/packages/2d/17/156db295b3b18bff559bb7b8dad62bdc2e599df239e1596438bb688ccf43/ulang-0.1.5-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b9548e5bf12f9aed89086c3a340b8149a608ad0178c3f8a29ff6630d0071e814",
                "md5": "26b87bf069f0f1f4765de59ab6da6768",
                "sha256": "e0ea1d82fcd5135cb6ccac22f6b6502f7b61a1cb4fc8e7ad550f715cb3f2dae6"
            },
            "downloads": -1,
            "filename": "ulang-0.1.5.tar.gz",
            "has_sig": false,
            "md5_digest": "26b87bf069f0f1f4765de59ab6da6768",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<3.10,>=3.7",
            "size": 340692,
            "upload_time": "2024-03-25T23:00:16",
            "upload_time_iso_8601": "2024-03-25T23:00:16.052638Z",
            "url": "https://files.pythonhosted.org/packages/b9/54/8e5bf12f9aed89086c3a340b8149a608ad0178c3f8a29ff6630d0071e814/ulang-0.1.5.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-03-25 23:00:16",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "ulang"
}
        
Elapsed time: 0.23498s