From 6984253b9882edf8cb49f9f783bc442141ffbd84 Mon Sep 17 00:00:00 2001 From: LY <51789698+Young-Lord@users.noreply.github.com> Date: Fri, 22 Mar 2024 13:17:39 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20Python=203.9=20?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 4 ++ README.md | 4 +- setup.py | 4 +- ...25\345\210\206\346\236\220\345\231\250.py" | 9 ++- .../unittest/\346\212\245\351\224\231.py" | 14 +++-- .../\350\257\255\346\263\225\346\240\221.py" | 55 ++++++++++++------- 6 files changed, 60 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d355ce..df4cd09 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.5 + +支持 Python 3.9 + ## 0.1.4(2024-2-20) [解决报错信息与测试用例不符问题](https://gitee.com/MulanRevive/mulan-rework/pulls/65) diff --git a/README.md b/README.md index 99de5de..f036a60 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ $ 木兰 测试/错误处理/引用模块.ul ### 试用发布版 -***必需 Python 3.7,源码文件需 UTF-8 编码***,`pip install ulang` 安装木兰。 +***必需 Python 3.7 ~ 3.9,源码文件需 UTF-8 编码***,`pip install ulang` 安装木兰。 ### 命令行交互环境 @@ -105,7 +105,7 @@ New -> Terminal 打开命令行,同样输入“木兰”运行 新手开发者请看[开发流程与项目结构简介](文档/开发上手.md)。 -使用 Python 3.7 的最新小版本。Mac、[Linux](https://gitee.com/MulanRevive/mulan-rework/issues/I1U9O3)、[Windows](https://gitee.com/MulanRevive/mulan-rework/issues/I1U2HP) 下全部测试通过。欢迎参与 [添加对 Python 3.8 的支持](https://gitee.com/MulanRevive/mulan-rework/issues/I6EGV4)。 +使用 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 代码等等。 diff --git a/setup.py b/setup.py index 66bb470..834a4a6 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ with open("README.md", encoding="utf-8", mode="r") as readme: setuptools.setup( name="ulang", # 木兰/__init__.py 中保持一致 - version="0.1.4", + version="0.1.5", license="GNU GPLv3", author="吴烜", author_email="mulanrevive@gmail.com", @@ -31,5 +31,5 @@ setuptools.setup( 'rply-ulang', 'codegen', ], - python_requires="== 3.7.*" + python_requires=">=3.7,<3.10", ) diff --git "a/\346\234\250\345\205\260/\345\210\206\346\236\220\345\231\250/\350\257\255\346\263\225\345\210\206\346\236\220\345\231\250.py" "b/\346\234\250\345\205\260/\345\210\206\346\236\220\345\231\250/\350\257\255\346\263\225\345\210\206\346\236\220\345\231\250.py" index e67a0a1..4ddb1b2 100644 --- "a/\346\234\250\345\205\260/\345\210\206\346\236\220\345\231\250/\350\257\255\346\263\225\345\210\206\346\236\220\345\231\250.py" +++ "b/\346\234\250\345\205\260/\345\210\206\346\236\220\345\231\250/\350\257\255\346\263\225\345\210\206\346\236\220\345\231\250.py" @@ -860,7 +860,14 @@ class 语法分析器: if 键 is None: 各参数.append(值) else: - 关键词.append(ast.keyword(arg=键, value=值)) + 关键词.append( + ast.keyword( + arg=键, + value=值, + lineno=语法树.取行号(片段), + col_offset=语法树.取列号(片段) + ) + ) return 语法树.新节点( 语法.调用, diff --git "a/\346\265\213\350\257\225/unittest/\346\212\245\351\224\231.py" "b/\346\265\213\350\257\225/unittest/\346\212\245\351\224\231.py" index e95f163..9500c12 100644 --- "a/\346\265\213\350\257\225/unittest/\346\212\245\351\224\231.py" +++ "b/\346\265\213\350\257\225/unittest/\346\212\245\351\224\231.py" @@ -129,9 +129,13 @@ class test所有(unittest.TestCase): self.assertEqual(报错[0], 报错_递归) # 间隔为 ast.py 与木兰源码 - if python3版本号 == 8: - self.assertEqual(报错[22], f"“{Path('测试/错误处理/循环引用/b.ul')}”第1行:using * in 测试.错误处理.循环引用.a") - self.assertEqual(报错[26], "见第1行:using * in 测试.错误处理.循环引用.b") + 报错内容1 = f"“{Path('测试/错误处理/循环引用/b.ul')}”第1行:using * in 测试.错误处理.循环引用.a" + 报错内容2 = "见第1行:using * in 测试.错误处理.循环引用.b" + if python3版本号 == 7: + self.assertEqual(报错[19], 报错内容1) + self.assertEqual(报错[23], 报错内容2) + elif 8 <= python3版本号 <= 9: + self.assertEqual(报错[22], 报错内容1) + self.assertEqual(报错[26], 报错内容2) else: - self.assertEqual(报错[19], f"“{Path('测试/错误处理/循环引用/b.ul')}”第1行:using * in 测试.错误处理.循环引用.a") - self.assertEqual(报错[23], "见第1行:using * in 测试.错误处理.循环引用.b") + self.fail("请使用 Python 3.7 ~ 3.9 版本运行此测试") diff --git "a/\346\265\213\350\257\225/unittest/\350\257\255\346\263\225\346\240\221.py" "b/\346\265\213\350\257\225/unittest/\350\257\255\346\263\225\346\240\221.py" index 56571df..fe2497b 100644 --- "a/\346\265\213\350\257\225/unittest/\350\257\255\346\263\225\346\240\221.py" +++ "b/\346\265\213\350\257\225/unittest/\350\257\255\346\263\225\346\240\221.py" @@ -5,6 +5,7 @@ from 木兰.共享 import python3版本号 from 木兰.分析器.词法分析器 import 分词器 from 测试.unittest.功用 import * + # TODO:需确保无此类 Warning:ParserGeneratorWarning: 28 shift/reduce conflicts class test语法树(unittest.TestCase): @@ -31,38 +32,52 @@ class test语法树(unittest.TestCase): def test_整树比较(self): 期望值_3_7 = { "反斜杠.ul": r"Module(body=[Expr(value=Call(func=Name(id='print', ctx=Load(), lineno=1, col_offset=1), args=[Str(s='\\', lineno=1, col_offset=7)], keywords=[], lineno=1, col_offset=1), lineno=1, col_offset=1)])", - "带类型参数.ul": "Module(body=[FunctionDef(name='hello', args=arguments(args=[arg(arg='p', annotation=Name(id='Person', ctx=Load(), lineno=1, col_offset=16), lineno=1, col_offset=12)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Return(value=Num(n=1, lineno=2, col_offset=10), lineno=2, col_offset=3)], decorator_list=[], lineno=1, col_offset=1)])", - "类型.ul": "Module(body=[ClassDef(name='Person', bases=[], keywords=[], body=[FunctionDef(name='__add__', args=arguments(args=[arg(arg='self', lineno=2, col_offset=12), arg(arg='a', annotation=None, lineno=2, col_offset=13)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Return(value=Call(func=Name(id='Person', ctx=Load(), lineno=2, col_offset=25), args=[BinOp(left=Attribute(value=Name(id='self', ctx=Load(), lineno=2, col_offset=32), attr='name', ctx=Load(), lineno=2, col_offset=32), op=Add(), right=Attribute(value=Name(id='a', ctx=Load(), lineno=2, col_offset=44), attr='name', ctx=Load(), lineno=2, col_offset=44), lineno=2, col_offset=32)], keywords=[], lineno=2, col_offset=25), lineno=2, col_offset=18)], decorator_list=[], lineno=2, col_offset=1), FunctionDef(name='__init__', args=arguments(args=[arg(arg='self', annotation=None, lineno=3, col_offset=1), arg(arg='name', annotation=None, lineno=3, col_offset=14)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Assign(targets=[Attribute(value=Name(id='self', ctx=Load(), lineno=3, col_offset=22), attr='name', ctx=Store(), lineno=3, col_offset=22)], value=Name(id='name', ctx=Load(), lineno=3, col_offset=34), lineno=3, col_offset=22)], decorator_list=[], lineno=3, col_offset=1)], decorator_list=[], lineno=1, col_offset=1)])", - "函数.ul": "Module(body=[FunctionDef(name='echo', args=arguments(args=[arg(arg='number', annotation=None, lineno=1, col_offset=11)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Expr(value=Call(func=Name(id='print', ctx=Load(), lineno=2, col_offset=1), args=[Name(id='number', ctx=Load(), lineno=2, col_offset=7)], keywords=[], lineno=2, col_offset=1), lineno=2, col_offset=1)], decorator_list=[], lineno=1, col_offset=1), Expr(value=Call(func=Name(id='echo', ctx=Load(), lineno=4, col_offset=1), args=[Num(n=2, lineno=4, col_offset=6)], keywords=[], lineno=4, col_offset=1), lineno=4, col_offset=1)])", - "空匿名函数.ul": "Module(body=[Assign(targets=[Name(id='b', ctx=Store(), lineno=1, col_offset=1)], value=Lambda(args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=Num(n=2, lineno=1, col_offset=11), lineno=0, col_offset=0), lineno=1, col_offset=1), Expr(value=Call(func=Name(id='print', ctx=Load(), lineno=2, col_offset=1), args=[Call(func=Name(id='b', ctx=Load(), lineno=2, col_offset=7), args=[], keywords=[], lineno=2, col_offset=7)], keywords=[], lineno=2, col_offset=1), lineno=2, col_offset=1)])", - "赋值.ul": "Module(body=[Assign(targets=[Name(id='a', ctx=Store(), lineno=1, col_offset=1)], value=Num(n=2, lineno=1, col_offset=3), lineno=1, col_offset=1), Expr(value=Call(func=Name(id='print', ctx=Load(), lineno=2, col_offset=1), args=[Name(id='a', ctx=Load(), lineno=2, col_offset=7)], keywords=[], lineno=2, col_offset=1), lineno=2, col_offset=1)])", - "多行运算.ul": "Module(body=[Expr(value=Call(func=Name(id='print', ctx=Load(), lineno=1, col_offset=1), args=[Num(n=0, lineno=1, col_offset=7)], keywords=[], lineno=1, col_offset=1), lineno=1, col_offset=1), Expr(value=Call(func=Name(id='print', ctx=Load(), lineno=2, col_offset=1), args=[BinOp(left=BinOp(left=Num(n=1, lineno=2, col_offset=7), op=Add(), right=BinOp(left=Num(n=2, lineno=2, col_offset=9), op=Mult(), right=Num(n=3, lineno=2, col_offset=11), lineno=2, col_offset=9), lineno=2, col_offset=7), op=Sub(), right=Call(func=Name(id='__div__', ctx=Load(), lineno=2, col_offset=13), args=[Num(n=4, lineno=2, col_offset=13), Num(n=5, lineno=2, col_offset=15)], keywords=[], lineno=2, col_offset=13), lineno=2, col_offset=7)], keywords=[], lineno=2, col_offset=1), lineno=2, col_offset=1)])", - "超类语法.ul": "Module(body=[ClassDef(name='Person', bases=[Name(id='list', ctx=Load(), lineno=1, col_offset=15)], keywords=[], body=[FunctionDef(name='__init__', args=arguments(args=[arg(arg='self', annotation=None, lineno=2, col_offset=3)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Expr(value=Call(func=Attribute(value=Call(func=Name(id='super', ctx=Load(), lineno=3, col_offset=5), args=[], keywords=[], lineno=3, col_offset=5), attr='__init__', ctx=Load(), lineno=3, col_offset=5), args=[], keywords=[], lineno=3, col_offset=5), lineno=3, col_offset=5)], decorator_list=[], lineno=2, col_offset=3)], decorator_list=[], lineno=1, col_offset=1), Assign(targets=[Name(id='p', ctx=Store(), lineno=6, col_offset=1)], value=Call(func=Name(id='Person', ctx=Load(), lineno=6, col_offset=5), args=[], keywords=[], lineno=6, col_offset=5), lineno=6, col_offset=1), Assign(targets=[Name(id='v', ctx=Store(), lineno=7, col_offset=1)], value=Call(func=Attribute(value=Name(id='p', ctx=Load(), lineno=7, col_offset=5), attr='super', ctx=Load(), lineno=7, col_offset=5), args=[], keywords=[], lineno=7, col_offset=7), lineno=7, col_offset=1), Expr(value=Call(func=Attribute(value=Name(id='Person', ctx=Load(), lineno=8, col_offset=1), attr='super', ctx=Load(), lineno=8, col_offset=1), args=[Name(id='None', ctx=Load(), lineno=8, col_offset=14)], keywords=[], lineno=8, col_offset=8), lineno=8, col_offset=8)])", - "指定函数类型.ul": "Module(body=[FunctionDef(name='hello', args=arguments(args=[arg(arg='p', annotation=Name(id='int', ctx=Load(), lineno=1, col_offset=16), lineno=1, col_offset=12)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Return(value=Name(id='p', ctx=Load(), lineno=2, col_offset=10), lineno=2, col_offset=3)], decorator_list=[], returns=Name(id='int', ctx=Load(), lineno=1, col_offset=23), lineno=1, col_offset=1)])", + "带类型参数.ul": r"Module(body=[FunctionDef(name='hello', args=arguments(args=[arg(arg='p', annotation=Name(id='Person', ctx=Load(), lineno=1, col_offset=16), lineno=1, col_offset=12)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Return(value=Num(n=1, lineno=2, col_offset=10), lineno=2, col_offset=3)], decorator_list=[], lineno=1, col_offset=1)])", + "类型.ul": r"Module(body=[ClassDef(name='Person', bases=[], keywords=[], body=[FunctionDef(name='__add__', args=arguments(args=[arg(arg='self', lineno=2, col_offset=12), arg(arg='a', annotation=None, lineno=2, col_offset=13)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Return(value=Call(func=Name(id='Person', ctx=Load(), lineno=2, col_offset=25), args=[BinOp(left=Attribute(value=Name(id='self', ctx=Load(), lineno=2, col_offset=32), attr='name', ctx=Load(), lineno=2, col_offset=32), op=Add(), right=Attribute(value=Name(id='a', ctx=Load(), lineno=2, col_offset=44), attr='name', ctx=Load(), lineno=2, col_offset=44), lineno=2, col_offset=32)], keywords=[], lineno=2, col_offset=25), lineno=2, col_offset=18)], decorator_list=[], lineno=2, col_offset=1), FunctionDef(name='__init__', args=arguments(args=[arg(arg='self', annotation=None, lineno=3, col_offset=1), arg(arg='name', annotation=None, lineno=3, col_offset=14)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Assign(targets=[Attribute(value=Name(id='self', ctx=Load(), lineno=3, col_offset=22), attr='name', ctx=Store(), lineno=3, col_offset=22)], value=Name(id='name', ctx=Load(), lineno=3, col_offset=34), lineno=3, col_offset=22)], decorator_list=[], lineno=3, col_offset=1)], decorator_list=[], lineno=1, col_offset=1)])", + "函数.ul": r"Module(body=[FunctionDef(name='echo', args=arguments(args=[arg(arg='number', annotation=None, lineno=1, col_offset=11)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Expr(value=Call(func=Name(id='print', ctx=Load(), lineno=2, col_offset=1), args=[Name(id='number', ctx=Load(), lineno=2, col_offset=7)], keywords=[], lineno=2, col_offset=1), lineno=2, col_offset=1)], decorator_list=[], lineno=1, col_offset=1), Expr(value=Call(func=Name(id='echo', ctx=Load(), lineno=4, col_offset=1), args=[Num(n=2, lineno=4, col_offset=6)], keywords=[], lineno=4, col_offset=1), lineno=4, col_offset=1)])", + "空匿名函数.ul": r"Module(body=[Assign(targets=[Name(id='b', ctx=Store(), lineno=1, col_offset=1)], value=Lambda(args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=Num(n=2, lineno=1, col_offset=11), lineno=0, col_offset=0), lineno=1, col_offset=1), Expr(value=Call(func=Name(id='print', ctx=Load(), lineno=2, col_offset=1), args=[Call(func=Name(id='b', ctx=Load(), lineno=2, col_offset=7), args=[], keywords=[], lineno=2, col_offset=7)], keywords=[], lineno=2, col_offset=1), lineno=2, col_offset=1)])", + "赋值.ul": r"Module(body=[Assign(targets=[Name(id='a', ctx=Store(), lineno=1, col_offset=1)], value=Num(n=2, lineno=1, col_offset=3), lineno=1, col_offset=1), Expr(value=Call(func=Name(id='print', ctx=Load(), lineno=2, col_offset=1), args=[Name(id='a', ctx=Load(), lineno=2, col_offset=7)], keywords=[], lineno=2, col_offset=1), lineno=2, col_offset=1)])", + "多行运算.ul": r"Module(body=[Expr(value=Call(func=Name(id='print', ctx=Load(), lineno=1, col_offset=1), args=[Num(n=0, lineno=1, col_offset=7)], keywords=[], lineno=1, col_offset=1), lineno=1, col_offset=1), Expr(value=Call(func=Name(id='print', ctx=Load(), lineno=2, col_offset=1), args=[BinOp(left=BinOp(left=Num(n=1, lineno=2, col_offset=7), op=Add(), right=BinOp(left=Num(n=2, lineno=2, col_offset=9), op=Mult(), right=Num(n=3, lineno=2, col_offset=11), lineno=2, col_offset=9), lineno=2, col_offset=7), op=Sub(), right=Call(func=Name(id='__div__', ctx=Load(), lineno=2, col_offset=13), args=[Num(n=4, lineno=2, col_offset=13), Num(n=5, lineno=2, col_offset=15)], keywords=[], lineno=2, col_offset=13), lineno=2, col_offset=7)], keywords=[], lineno=2, col_offset=1), lineno=2, col_offset=1)])", + "超类语法.ul": r"Module(body=[ClassDef(name='Person', bases=[Name(id='list', ctx=Load(), lineno=1, col_offset=15)], keywords=[], body=[FunctionDef(name='__init__', args=arguments(args=[arg(arg='self', annotation=None, lineno=2, col_offset=3)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Expr(value=Call(func=Attribute(value=Call(func=Name(id='super', ctx=Load(), lineno=3, col_offset=5), args=[], keywords=[], lineno=3, col_offset=5), attr='__init__', ctx=Load(), lineno=3, col_offset=5), args=[], keywords=[], lineno=3, col_offset=5), lineno=3, col_offset=5)], decorator_list=[], lineno=2, col_offset=3)], decorator_list=[], lineno=1, col_offset=1), Assign(targets=[Name(id='p', ctx=Store(), lineno=6, col_offset=1)], value=Call(func=Name(id='Person', ctx=Load(), lineno=6, col_offset=5), args=[], keywords=[], lineno=6, col_offset=5), lineno=6, col_offset=1), Assign(targets=[Name(id='v', ctx=Store(), lineno=7, col_offset=1)], value=Call(func=Attribute(value=Name(id='p', ctx=Load(), lineno=7, col_offset=5), attr='super', ctx=Load(), lineno=7, col_offset=5), args=[], keywords=[], lineno=7, col_offset=7), lineno=7, col_offset=1), Expr(value=Call(func=Attribute(value=Name(id='Person', ctx=Load(), lineno=8, col_offset=1), attr='super', ctx=Load(), lineno=8, col_offset=1), args=[Name(id='None', ctx=Load(), lineno=8, col_offset=14)], keywords=[], lineno=8, col_offset=8), lineno=8, col_offset=8)])", + "指定函数类型.ul": r"Module(body=[FunctionDef(name='hello', args=arguments(args=[arg(arg='p', annotation=Name(id='int', ctx=Load(), lineno=1, col_offset=16), lineno=1, col_offset=12)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Return(value=Name(id='p', ctx=Load(), lineno=2, col_offset=10), lineno=2, col_offset=3)], decorator_list=[], returns=Name(id='int', ctx=Load(), lineno=1, col_offset=23), lineno=1, col_offset=1)])", "顺便处理各表达式前缀.ul": r"Module(body=[With(items=[withitem(context_expr=Name(id='c', ctx=Load(), lineno=1, col_offset=9), optional_vars=Tuple(elts=[Name(id='a', ctx=Load(), lineno=1, col_offset=5), Name(id='b', ctx=Load(), lineno=1, col_offset=7)], ctx=Store(), lineno=1, col_offset=5))], body=[Pass( lineno=1, col_offset=11)], lineno=1, col_offset=1)])", - "善后.ul": "Module(body=[Try(body=[Pass( lineno=1, col_offset=5)], handlers=[Pass( lineno=1, col_offset=5)], orelse=[], finalbody=[Pass( lineno=1, col_offset=16)], lineno=1, col_offset=1)])", + "善后.ul": r"Module(body=[Try(body=[Pass( lineno=1, col_offset=5)], handlers=[Pass( lineno=1, col_offset=5)], orelse=[], finalbody=[Pass( lineno=1, col_offset=16)], lineno=1, col_offset=1)])", } - + 期望值_3_8 = { "反斜杠.ul": r"Module(body=[Expr(value=Call(func=Name(id='print', ctx=Load(), lineno=1, col_offset=1), args=[Constant(value='\\', lineno=1, col_offset=7)], keywords=[], lineno=1, col_offset=1), lineno=1, col_offset=1)], type_ignores=[])", - "带类型参数.ul": "Module(body=[FunctionDef(name='hello', args=arguments(posonlyargs=[], args=[arg(arg='p', annotation=Name(id='Person', ctx=Load(), lineno=1, col_offset=16), lineno=1, col_offset=12)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Return(value=Constant(value=1, lineno=2, col_offset=10), lineno=2, col_offset=3)], decorator_list=[], lineno=1, col_offset=1)], type_ignores=[])", - "类型.ul": "Module(body=[ClassDef(name='Person', bases=[], keywords=[], body=[FunctionDef(name='__add__', args=arguments(posonlyargs=[], args=[arg(arg='self', lineno=2, col_offset=12), arg(arg='a', annotation=None, lineno=2, col_offset=13)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Return(value=Call(func=Name(id='Person', ctx=Load(), lineno=2, col_offset=25), args=[BinOp(left=Attribute(value=Name(id='self', ctx=Load(), lineno=2, col_offset=32), attr='name', ctx=Load(), lineno=2, col_offset=32), op=Add(), right=Attribute(value=Name(id='a', ctx=Load(), lineno=2, col_offset=44), attr='name', ctx=Load(), lineno=2, col_offset=44), lineno=2, col_offset=32)], keywords=[], lineno=2, col_offset=25), lineno=2, col_offset=18)], decorator_list=[], lineno=2, col_offset=1), FunctionDef(name='__init__', args=arguments(posonlyargs=[], args=[arg(arg='self', annotation=None, lineno=3, col_offset=1), arg(arg='name', annotation=None, lineno=3, col_offset=14)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Assign(targets=[Attribute(value=Name(id='self', ctx=Load(), lineno=3, col_offset=22), attr='name', ctx=Store(), lineno=3, col_offset=22)], value=Name(id='name', ctx=Load(), lineno=3, col_offset=34), lineno=3, col_offset=22)], decorator_list=[], lineno=3, col_offset=1)], decorator_list=[], lineno=1, col_offset=1)], type_ignores=[])", - "函数.ul": "Module(body=[FunctionDef(name='echo', args=arguments(posonlyargs=[], args=[arg(arg='number', annotation=None, lineno=1, col_offset=11)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Expr(value=Call(func=Name(id='print', ctx=Load(), lineno=2, col_offset=1), args=[Name(id='number', ctx=Load(), lineno=2, col_offset=7)], keywords=[], lineno=2, col_offset=1), lineno=2, col_offset=1)], decorator_list=[], lineno=1, col_offset=1), Expr(value=Call(func=Name(id='echo', ctx=Load(), lineno=4, col_offset=1), args=[Constant(value=2, lineno=4, col_offset=6)], keywords=[], lineno=4, col_offset=1), lineno=4, col_offset=1)], type_ignores=[])", - "空匿名函数.ul": "Module(body=[Assign(targets=[Name(id='b', ctx=Store(), lineno=1, col_offset=1)], value=Lambda(args=arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=Constant(value=2, lineno=1, col_offset=11), lineno=0, col_offset=0), lineno=1, col_offset=1), Expr(value=Call(func=Name(id='print', ctx=Load(), lineno=2, col_offset=1), args=[Call(func=Name(id='b', ctx=Load(), lineno=2, col_offset=7), args=[], keywords=[], lineno=2, col_offset=7)], keywords=[], lineno=2, col_offset=1), lineno=2, col_offset=1)], type_ignores=[])", - "赋值.ul": "Module(body=[Assign(targets=[Name(id='a', ctx=Store(), lineno=1, col_offset=1)], value=Constant(value=2, lineno=1, col_offset=3), lineno=1, col_offset=1), Expr(value=Call(func=Name(id='print', ctx=Load(), lineno=2, col_offset=1), args=[Name(id='a', ctx=Load(), lineno=2, col_offset=7)], keywords=[], lineno=2, col_offset=1), lineno=2, col_offset=1)], type_ignores=[])", - "多行运算.ul": "Module(body=[Expr(value=Call(func=Name(id='print', ctx=Load(), lineno=1, col_offset=1), args=[Constant(value=0, lineno=1, col_offset=7)], keywords=[], lineno=1, col_offset=1), lineno=1, col_offset=1), Expr(value=Call(func=Name(id='print', ctx=Load(), lineno=2, col_offset=1), args=[BinOp(left=BinOp(left=Constant(value=1, lineno=2, col_offset=7), op=Add(), right=BinOp(left=Constant(value=2, lineno=2, col_offset=9), op=Mult(), right=Constant(value=3, lineno=2, col_offset=11), lineno=2, col_offset=9), lineno=2, col_offset=7), op=Sub(), right=Call(func=Name(id='__div__', ctx=Load(), lineno=2, col_offset=13), args=[Constant(value=4, lineno=2, col_offset=13), Constant(value=5, lineno=2, col_offset=15)], keywords=[], lineno=2, col_offset=13), lineno=2, col_offset=7)], keywords=[], lineno=2, col_offset=1), lineno=2, col_offset=1)], type_ignores=[])", - "超类语法.ul": "Module(body=[ClassDef(name='Person', bases=[Name(id='list', ctx=Load(), lineno=1, col_offset=15)], keywords=[], body=[FunctionDef(name='__init__', args=arguments(posonlyargs=[], args=[arg(arg='self', annotation=None, lineno=2, col_offset=3)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Expr(value=Call(func=Attribute(value=Call(func=Name(id='super', ctx=Load(), lineno=3, col_offset=5), args=[], keywords=[], lineno=3, col_offset=5), attr='__init__', ctx=Load(), lineno=3, col_offset=5), args=[], keywords=[], lineno=3, col_offset=5), lineno=3, col_offset=5)], decorator_list=[], lineno=2, col_offset=3)], decorator_list=[], lineno=1, col_offset=1), Assign(targets=[Name(id='p', ctx=Store(), lineno=6, col_offset=1)], value=Call(func=Name(id='Person', ctx=Load(), lineno=6, col_offset=5), args=[], keywords=[], lineno=6, col_offset=5), lineno=6, col_offset=1), Assign(targets=[Name(id='v', ctx=Store(), lineno=7, col_offset=1)], value=Call(func=Attribute(value=Name(id='p', ctx=Load(), lineno=7, col_offset=5), attr='super', ctx=Load(), lineno=7, col_offset=5), args=[], keywords=[], lineno=7, col_offset=7), lineno=7, col_offset=1), Expr(value=Call(func=Attribute(value=Name(id='Person', ctx=Load(), lineno=8, col_offset=1), attr='super', ctx=Load(), lineno=8, col_offset=1), args=[Name(id='None', ctx=Load(), lineno=8, col_offset=14)], keywords=[], lineno=8, col_offset=8), lineno=8, col_offset=8)], type_ignores=[])", - "指定函数类型.ul": "Module(body=[FunctionDef(name='hello', args=arguments(posonlyargs=[], args=[arg(arg='p', annotation=Name(id='int', ctx=Load(), lineno=1, col_offset=16), lineno=1, col_offset=12)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Return(value=Name(id='p', ctx=Load(), lineno=2, col_offset=10), lineno=2, col_offset=3)], decorator_list=[], returns=Name(id='int', ctx=Load(), lineno=1, col_offset=23), lineno=1, col_offset=1)], type_ignores=[])", + "带类型参数.ul": r"Module(body=[FunctionDef(name='hello', args=arguments(posonlyargs=[], args=[arg(arg='p', annotation=Name(id='Person', ctx=Load(), lineno=1, col_offset=16), lineno=1, col_offset=12)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Return(value=Constant(value=1, lineno=2, col_offset=10), lineno=2, col_offset=3)], decorator_list=[], lineno=1, col_offset=1)], type_ignores=[])", + "类型.ul": r"Module(body=[ClassDef(name='Person', bases=[], keywords=[], body=[FunctionDef(name='__add__', args=arguments(posonlyargs=[], args=[arg(arg='self', lineno=2, col_offset=12), arg(arg='a', annotation=None, lineno=2, col_offset=13)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Return(value=Call(func=Name(id='Person', ctx=Load(), lineno=2, col_offset=25), args=[BinOp(left=Attribute(value=Name(id='self', ctx=Load(), lineno=2, col_offset=32), attr='name', ctx=Load(), lineno=2, col_offset=32), op=Add(), right=Attribute(value=Name(id='a', ctx=Load(), lineno=2, col_offset=44), attr='name', ctx=Load(), lineno=2, col_offset=44), lineno=2, col_offset=32)], keywords=[], lineno=2, col_offset=25), lineno=2, col_offset=18)], decorator_list=[], lineno=2, col_offset=1), FunctionDef(name='__init__', args=arguments(posonlyargs=[], args=[arg(arg='self', annotation=None, lineno=3, col_offset=1), arg(arg='name', annotation=None, lineno=3, col_offset=14)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Assign(targets=[Attribute(value=Name(id='self', ctx=Load(), lineno=3, col_offset=22), attr='name', ctx=Store(), lineno=3, col_offset=22)], value=Name(id='name', ctx=Load(), lineno=3, col_offset=34), lineno=3, col_offset=22)], decorator_list=[], lineno=3, col_offset=1)], decorator_list=[], lineno=1, col_offset=1)], type_ignores=[])", + "函数.ul": r"Module(body=[FunctionDef(name='echo', args=arguments(posonlyargs=[], args=[arg(arg='number', annotation=None, lineno=1, col_offset=11)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Expr(value=Call(func=Name(id='print', ctx=Load(), lineno=2, col_offset=1), args=[Name(id='number', ctx=Load(), lineno=2, col_offset=7)], keywords=[], lineno=2, col_offset=1), lineno=2, col_offset=1)], decorator_list=[], lineno=1, col_offset=1), Expr(value=Call(func=Name(id='echo', ctx=Load(), lineno=4, col_offset=1), args=[Constant(value=2, lineno=4, col_offset=6)], keywords=[], lineno=4, col_offset=1), lineno=4, col_offset=1)], type_ignores=[])", + "空匿名函数.ul": r"Module(body=[Assign(targets=[Name(id='b', ctx=Store(), lineno=1, col_offset=1)], value=Lambda(args=arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=Constant(value=2, lineno=1, col_offset=11), lineno=0, col_offset=0), lineno=1, col_offset=1), Expr(value=Call(func=Name(id='print', ctx=Load(), lineno=2, col_offset=1), args=[Call(func=Name(id='b', ctx=Load(), lineno=2, col_offset=7), args=[], keywords=[], lineno=2, col_offset=7)], keywords=[], lineno=2, col_offset=1), lineno=2, col_offset=1)], type_ignores=[])", + "赋值.ul": r"Module(body=[Assign(targets=[Name(id='a', ctx=Store(), lineno=1, col_offset=1)], value=Constant(value=2, lineno=1, col_offset=3), lineno=1, col_offset=1), Expr(value=Call(func=Name(id='print', ctx=Load(), lineno=2, col_offset=1), args=[Name(id='a', ctx=Load(), lineno=2, col_offset=7)], keywords=[], lineno=2, col_offset=1), lineno=2, col_offset=1)], type_ignores=[])", + "多行运算.ul": r"Module(body=[Expr(value=Call(func=Name(id='print', ctx=Load(), lineno=1, col_offset=1), args=[Constant(value=0, lineno=1, col_offset=7)], keywords=[], lineno=1, col_offset=1), lineno=1, col_offset=1), Expr(value=Call(func=Name(id='print', ctx=Load(), lineno=2, col_offset=1), args=[BinOp(left=BinOp(left=Constant(value=1, lineno=2, col_offset=7), op=Add(), right=BinOp(left=Constant(value=2, lineno=2, col_offset=9), op=Mult(), right=Constant(value=3, lineno=2, col_offset=11), lineno=2, col_offset=9), lineno=2, col_offset=7), op=Sub(), right=Call(func=Name(id='__div__', ctx=Load(), lineno=2, col_offset=13), args=[Constant(value=4, lineno=2, col_offset=13), Constant(value=5, lineno=2, col_offset=15)], keywords=[], lineno=2, col_offset=13), lineno=2, col_offset=7)], keywords=[], lineno=2, col_offset=1), lineno=2, col_offset=1)], type_ignores=[])", + "超类语法.ul": r"Module(body=[ClassDef(name='Person', bases=[Name(id='list', ctx=Load(), lineno=1, col_offset=15)], keywords=[], body=[FunctionDef(name='__init__', args=arguments(posonlyargs=[], args=[arg(arg='self', annotation=None, lineno=2, col_offset=3)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Expr(value=Call(func=Attribute(value=Call(func=Name(id='super', ctx=Load(), lineno=3, col_offset=5), args=[], keywords=[], lineno=3, col_offset=5), attr='__init__', ctx=Load(), lineno=3, col_offset=5), args=[], keywords=[], lineno=3, col_offset=5), lineno=3, col_offset=5)], decorator_list=[], lineno=2, col_offset=3)], decorator_list=[], lineno=1, col_offset=1), Assign(targets=[Name(id='p', ctx=Store(), lineno=6, col_offset=1)], value=Call(func=Name(id='Person', ctx=Load(), lineno=6, col_offset=5), args=[], keywords=[], lineno=6, col_offset=5), lineno=6, col_offset=1), Assign(targets=[Name(id='v', ctx=Store(), lineno=7, col_offset=1)], value=Call(func=Attribute(value=Name(id='p', ctx=Load(), lineno=7, col_offset=5), attr='super', ctx=Load(), lineno=7, col_offset=5), args=[], keywords=[], lineno=7, col_offset=7), lineno=7, col_offset=1), Expr(value=Call(func=Attribute(value=Name(id='Person', ctx=Load(), lineno=8, col_offset=1), attr='super', ctx=Load(), lineno=8, col_offset=1), args=[Name(id='None', ctx=Load(), lineno=8, col_offset=14)], keywords=[], lineno=8, col_offset=8), lineno=8, col_offset=8)], type_ignores=[])", + "指定函数类型.ul": r"Module(body=[FunctionDef(name='hello', args=arguments(posonlyargs=[], args=[arg(arg='p', annotation=Name(id='int', ctx=Load(), lineno=1, col_offset=16), lineno=1, col_offset=12)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Return(value=Name(id='p', ctx=Load(), lineno=2, col_offset=10), lineno=2, col_offset=3)], decorator_list=[], returns=Name(id='int', ctx=Load(), lineno=1, col_offset=23), lineno=1, col_offset=1)], type_ignores=[])", "顺便处理各表达式前缀.ul": r"Module(body=[With(items=[withitem(context_expr=Name(id='c', ctx=Load(), lineno=1, col_offset=9), optional_vars=Tuple(elts=[Name(id='a', ctx=Load(), lineno=1, col_offset=5), Name(id='b', ctx=Load(), lineno=1, col_offset=7)], ctx=Store(), lineno=1, col_offset=5))], body=[Pass(lineno=1, col_offset=11)], lineno=1, col_offset=1)], type_ignores=[])", - "善后.ul": "Module(body=[Try(body=[Pass(lineno=1, col_offset=5)], handlers=[Pass(lineno=1, col_offset=5)], orelse=[], finalbody=[Pass(lineno=1, col_offset=16)], lineno=1, col_offset=1)], type_ignores=[])", + "善后.ul": r"Module(body=[Try(body=[Pass(lineno=1, col_offset=5)], handlers=[Pass(lineno=1, col_offset=5)], orelse=[], finalbody=[Pass(lineno=1, col_offset=16)], lineno=1, col_offset=1)], type_ignores=[])", } + 期望值_3_9 = 期望值_3_8.copy() + 期望值_3_9.update( + { + "带类型参数.ul": r"Module(body=[FunctionDef(name='hello', args=arguments(posonlyargs=[], args=[arg(arg='p', annotation=Name(id='Person', ctx=Load(), lineno=1, col_offset=16), lineno=1, col_offset=12)], kwonlyargs=[], kw_defaults=[], defaults=[]), body=[Return(value=Constant(value=1, lineno=2, col_offset=10), lineno=2, col_offset=3)], decorator_list=[], lineno=1, col_offset=1)], type_ignores=[])", + "类型.ul": r"Module(body=[ClassDef(name='Person', bases=[], keywords=[], body=[FunctionDef(name='__add__', args=arguments(posonlyargs=[], args=[arg(arg='self', lineno=2, col_offset=12), arg(arg='a', lineno=2, col_offset=13)], kwonlyargs=[], kw_defaults=[], defaults=[]), body=[Return(value=Call(func=Name(id='Person', ctx=Load(), lineno=2, col_offset=25), args=[BinOp(left=Attribute(value=Name(id='self', ctx=Load(), lineno=2, col_offset=32), attr='name', ctx=Load(), lineno=2, col_offset=32), op=Add(), right=Attribute(value=Name(id='a', ctx=Load(), lineno=2, col_offset=44), attr='name', ctx=Load(), lineno=2, col_offset=44), lineno=2, col_offset=32)], keywords=[], lineno=2, col_offset=25), lineno=2, col_offset=18)], decorator_list=[], lineno=2, col_offset=1), FunctionDef(name='__init__', args=arguments(posonlyargs=[], args=[arg(arg='self', lineno=3, col_offset=1), arg(arg='name', lineno=3, col_offset=14)], kwonlyargs=[], kw_defaults=[], defaults=[]), body=[Assign(targets=[Attribute(value=Name(id='self', ctx=Load(), lineno=3, col_offset=22), attr='name', ctx=Store(), lineno=3, col_offset=22)], value=Name(id='name', ctx=Load(), lineno=3, col_offset=34), lineno=3, col_offset=22)], decorator_list=[], lineno=3, col_offset=1)], decorator_list=[], lineno=1, col_offset=1)], type_ignores=[])", + "函数.ul": r"Module(body=[FunctionDef(name='echo', args=arguments(posonlyargs=[], args=[arg(arg='number', lineno=1, col_offset=11)], kwonlyargs=[], kw_defaults=[], defaults=[]), body=[Expr(value=Call(func=Name(id='print', ctx=Load(), lineno=2, col_offset=1), args=[Name(id='number', ctx=Load(), lineno=2, col_offset=7)], keywords=[], lineno=2, col_offset=1), lineno=2, col_offset=1)], decorator_list=[], lineno=1, col_offset=1), Expr(value=Call(func=Name(id='echo', ctx=Load(), lineno=4, col_offset=1), args=[Constant(value=2, lineno=4, col_offset=6)], keywords=[], lineno=4, col_offset=1), lineno=4, col_offset=1)], type_ignores=[])", + "空匿名函数.ul": r"Module(body=[Assign(targets=[Name(id='b', ctx=Store(), lineno=1, col_offset=1)], value=Lambda(args=arguments(posonlyargs=[], args=[], kwonlyargs=[], kw_defaults=[], defaults=[]), body=Constant(value=2, lineno=1, col_offset=11), lineno=0, col_offset=0), lineno=1, col_offset=1), Expr(value=Call(func=Name(id='print', ctx=Load(), lineno=2, col_offset=1), args=[Call(func=Name(id='b', ctx=Load(), lineno=2, col_offset=7), args=[], keywords=[], lineno=2, col_offset=7)], keywords=[], lineno=2, col_offset=1), lineno=2, col_offset=1)], type_ignores=[])", + "超类语法.ul": r"Module(body=[ClassDef(name='Person', bases=[Name(id='list', ctx=Load(), lineno=1, col_offset=15)], keywords=[], body=[FunctionDef(name='__init__', args=arguments(posonlyargs=[], args=[arg(arg='self', lineno=2, col_offset=3)], kwonlyargs=[], kw_defaults=[], defaults=[]), body=[Expr(value=Call(func=Attribute(value=Call(func=Name(id='super', ctx=Load(), lineno=3, col_offset=5), args=[], keywords=[], lineno=3, col_offset=5), attr='__init__', ctx=Load(), lineno=3, col_offset=5), args=[], keywords=[], lineno=3, col_offset=5), lineno=3, col_offset=5)], decorator_list=[], lineno=2, col_offset=3)], decorator_list=[], lineno=1, col_offset=1), Assign(targets=[Name(id='p', ctx=Store(), lineno=6, col_offset=1)], value=Call(func=Name(id='Person', ctx=Load(), lineno=6, col_offset=5), args=[], keywords=[], lineno=6, col_offset=5), lineno=6, col_offset=1), Assign(targets=[Name(id='v', ctx=Store(), lineno=7, col_offset=1)], value=Call(func=Attribute(value=Name(id='p', ctx=Load(), lineno=7, col_offset=5), attr='super', ctx=Load(), lineno=7, col_offset=5), args=[], keywords=[], lineno=7, col_offset=7), lineno=7, col_offset=1), Expr(value=Call(func=Attribute(value=Name(id='Person', ctx=Load(), lineno=8, col_offset=1), attr='super', ctx=Load(), lineno=8, col_offset=1), args=[Name(id='None', ctx=Load(), lineno=8, col_offset=14)], keywords=[], lineno=8, col_offset=8), lineno=8, col_offset=8)], type_ignores=[])", + "指定函数类型.ul": r"Module(body=[FunctionDef(name='hello', args=arguments(posonlyargs=[], args=[arg(arg='p', annotation=Name(id='int', ctx=Load(), lineno=1, col_offset=16), lineno=1, col_offset=12)], kwonlyargs=[], kw_defaults=[], defaults=[]), body=[Return(value=Name(id='p', ctx=Load(), lineno=2, col_offset=10), lineno=2, col_offset=3)], decorator_list=[], returns=Name(id='int', ctx=Load(), lineno=1, col_offset=23), lineno=1, col_offset=1)], type_ignores=[])", + } + ) + if python3版本号 == 7: self._test_整树比较(期望值_3_7) elif python3版本号 == 8: self._test_整树比较(期望值_3_8) + elif python3版本号 == 9: + self._test_整树比较(期望值_3_9) else: - self.fail("请使用 Python 3.7 或 3.8 版本运行此测试") + self.fail("请使用 Python 3.7 ~ 3.9 版本运行此测试") def _test_整树比较(self, 期望值): 路径 = "测试/unittest/例程/" -- Gitee From 08a38bb8d5579718eb9e54e8d4d96f3c4d6dbe6a Mon Sep 17 00:00:00 2001 From: LY <51789698+Young-Lord@users.noreply.github.com> Date: Fri, 22 Mar 2024 13:18:24 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0=E4=BB=A3=E7=A0=81=E9=AB=98=E4=BA=AE?= =?UTF-8?q?=E8=AF=AD=E8=A8=80=E3=80=81=E5=A2=9E=E5=8A=A0=E7=A4=BA=E4=BE=8B?= =?UTF-8?q?=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 50 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index f036a60..ecfc7bd 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ for 转角 in 0..4 { 交互环境中仅提示出错所在位置简要信息: -``` +```javascript > func a(n) { return n1+1 } > func b(n) { print(n) } > b(a(2)) @@ -51,7 +51,7 @@ for 转角 in 0..4 { 运行源码时,可见调用各层的详细信息。如果错误发生在其他文件,可见文件名: -``` +```terminal $ 木兰 测试/错误处理/引用模块.ul 😰 取列表内容时,索引超出范围 “测试/错误处理/下标越界函数.ul”第2行:print([][0]) @@ -75,7 +75,7 @@ $ 木兰 测试/错误处理/引用模块.ul ### 命令行交互环境 -``` +```terminal $ 木兰 木兰向您问好 更多信息请说'你好' @@ -116,38 +116,70 @@ New -> Terminal 打开命令行,同样输入“木兰”运行 ### 本地运行 -``` +```terminal $ python -m 木兰 +木兰向您问好 +更多信息请说'你好' +> ``` ### 运行测试 1. 重现项目自身测试 -``` +```terminal $ python -m unittest 测试.unittest.交互 测试.unittest.语法树 测试.unittest.所有用例 测试.unittest.报错 测试.unittest.Python到木兰 +........ +---------------------------------------------------------------------- +Ran 12 tests in 2.000s + +OK ``` 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 以外其他系统下,会对从 PyPI 安装的版本进行测试: +以下测试语法相关用例。Windows 以外其他系统下,会对从 PyPI 安装的版本进行测试: -``` +```terminal $ python 测试/运行所有.py +通过: 运算/加.ul +…… +通过: 算法/排序/快速.ul +=================== +!全部通过! +本测试针对木兰原始可执行文件与重现项目的发布版。在此之前先运行`测试/unittest`下的集成测试。 ``` 以下测试源码生成相关用例: -``` +```terminal $ python -m unittest 测试.unittest.原始可执行文件 +. +---------------------------------------------------------------------- +Ran 1 test in 53.000s + +OK ``` 以下测试木兰源码转换为 Python: -``` +```terminal $ python -m unittest 测试.unittest.木兰到Python +加载文件 测试/unittest/源码生成/木兰到Python\AnnAssign.ul... +…… +加载文件 测试/unittest/源码生成/木兰到Python\输出nil.ul... +得到原始木兰生成结果中... +进度: (0/11) +比较 测试/unittest/源码生成/木兰到Python\AnnAssign.ul +…… +比较 测试/unittest/源码生成/木兰到Python\输出nil.ul +. +---------------------------------------------------------------------- +Ran 1 test in 12.000s + +OK ``` ## 许可证 -- Gitee From 8dd6be4fad70f9151b3210c4b1724efc3b020620 Mon Sep 17 00:00:00 2001 From: LY <51789698+Young-Lord@users.noreply.github.com> Date: Fri, 22 Mar 2024 13:33:05 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=96=87=E6=A1=A3?= =?UTF-8?q?=EF=BC=9A=20Python=203.9=20=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../py3.8\346\224\257\346\214\201.md" | 0 .../py3.9\346\224\257\346\214\201.md" | 74 +++++++++++++++++++ 2 files changed, 74 insertions(+) rename "\346\226\207\346\241\243/\345\212\237\350\203\275/py3.8\346\224\257\346\214\201.md" => "\346\226\207\346\241\243/\345\212\237\350\203\275/Python\347\211\210\346\234\254\346\224\257\346\214\201\346\203\205\345\206\265/py3.8\346\224\257\346\214\201.md" (100%) create mode 100644 "\346\226\207\346\241\243/\345\212\237\350\203\275/Python\347\211\210\346\234\254\346\224\257\346\214\201\346\203\205\345\206\265/py3.9\346\224\257\346\214\201.md" diff --git "a/\346\226\207\346\241\243/\345\212\237\350\203\275/py3.8\346\224\257\346\214\201.md" "b/\346\226\207\346\241\243/\345\212\237\350\203\275/Python\347\211\210\346\234\254\346\224\257\346\214\201\346\203\205\345\206\265/py3.8\346\224\257\346\214\201.md" similarity index 100% rename from "\346\226\207\346\241\243/\345\212\237\350\203\275/py3.8\346\224\257\346\214\201.md" rename to "\346\226\207\346\241\243/\345\212\237\350\203\275/Python\347\211\210\346\234\254\346\224\257\346\214\201\346\203\205\345\206\265/py3.8\346\224\257\346\214\201.md" diff --git "a/\346\226\207\346\241\243/\345\212\237\350\203\275/Python\347\211\210\346\234\254\346\224\257\346\214\201\346\203\205\345\206\265/py3.9\346\224\257\346\214\201.md" "b/\346\226\207\346\241\243/\345\212\237\350\203\275/Python\347\211\210\346\234\254\346\224\257\346\214\201\346\203\205\345\206\265/py3.9\346\224\257\346\214\201.md" new file mode 100644 index 0000000..d28449b --- /dev/null +++ "b/\346\226\207\346\241\243/\345\212\237\350\203\275/Python\347\211\210\346\234\254\346\224\257\346\214\201\346\203\205\345\206\265/py3.9\346\224\257\346\214\201.md" @@ -0,0 +1,74 @@ +# Python 3.9 支持 + +## 支持情况测试 + +测试平台: Ubuntu 20.04.3 LTS AMD64 (WSL 1) +用于进行测试的 Python 版本详细信息: + +```plaintext +Python 3.9.19 (main, Mar 20 2024, 18:08:17) [GCC 9.4.0] on linux +``` + +运行重现项目自身测试的结果与 Python 3.8 下的测试结果完全相同,包括警告信息。 + +## 命令行参数行为对比测试 + +使用`py3.8支持.md`文件中给出的`反汇编测试.ul`运行`木兰 --反汇编 反汇编测试.ul`,结果如下: + +```plaintext + 1 0 LOAD_CONST 0 (0) + 2 STORE_NAME 0 (i) + + 3 >> 4 LOAD_NAME 0 (i) + 6 LOAD_CONST 1 (10) + 8 COMPARE_OP 1 (<=) + 10 POP_JUMP_IF_FALSE 80 + + 4 12 LOAD_NAME 0 (i) + 14 LOAD_CONST 2 (1) + 16 INPLACE_ADD + 18 STORE_NAME 0 (i) + + 6 20 SETUP_FINALLY 18 (to 40) + + 7 22 LOAD_NAME 1 (__rem__) + 24 LOAD_NAME 0 (i) + 26 LOAD_CONST 3 (2) + 28 CALL_FUNCTION 2 + 30 POP_JUMP_IF_FALSE 36 + + 8 32 POP_BLOCK + 34 JUMP_ABSOLUTE 4 + >> 36 POP_BLOCK + 38 JUMP_FORWARD 30 (to 70) + + 10 >> 40 POP_TOP + 42 STORE_NAME 2 (Exception) + 44 POP_TOP + 46 SETUP_FINALLY 12 (to 60) + 48 POP_BLOCK + 50 POP_EXCEPT + 52 LOAD_CONST 4 (None) + 54 STORE_NAME 2 (Exception) + 56 DELETE_NAME 2 (Exception) + 58 JUMP_FORWARD 10 (to 70) + >> 60 LOAD_CONST 4 (None) + 62 STORE_NAME 2 (Exception) + 64 DELETE_NAME 2 (Exception) + 66 RERAISE + 68 RERAISE + + 12 >> 70 LOAD_NAME 3 (println) + 72 LOAD_NAME 0 (i) + 74 CALL_FUNCTION 1 + 76 POP_TOP + 78 JUMP_ABSOLUTE 4 + >> 80 LOAD_CONST 4 (None) + 82 RETURN_VALUE +``` + +其中新出现了`RERAISE`操作码,关于其具体的作用以及其它差别,可以参考 [dis --- Python 字节码反汇编器 — Python 3.9.18 文档](https://docs.python.org/zh-cn/3.9/library/dis.html#opcode-RERAISE)。 + +### 语法树节点差异 + +Python 3.9 中,函数调用时的[关键字参数](https://docs.python.org/zh-cn/3.9/glossary.html#term-argument)必须提供`lineno`与`col_offset`属性,否则会出现形如如下的异常:`类型错误:required field "lineno" missing from keyword`。 -- Gitee From 8a423d35a42fe87ee0d1b975a42be23f9b719634 Mon Sep 17 00:00:00 2001 From: LY <51789698+Young-Lord@users.noreply.github.com> Date: Fri, 22 Mar 2024 17:33:48 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E6=96=87=E6=A1=A3=E6=A0=87=E9=A2=98?= =?UTF-8?q?=E5=BE=AE=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../py3.9\346\224\257\346\214\201.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/\346\226\207\346\241\243/\345\212\237\350\203\275/Python\347\211\210\346\234\254\346\224\257\346\214\201\346\203\205\345\206\265/py3.9\346\224\257\346\214\201.md" "b/\346\226\207\346\241\243/\345\212\237\350\203\275/Python\347\211\210\346\234\254\346\224\257\346\214\201\346\203\205\345\206\265/py3.9\346\224\257\346\214\201.md" index d28449b..0236b30 100644 --- "a/\346\226\207\346\241\243/\345\212\237\350\203\275/Python\347\211\210\346\234\254\346\224\257\346\214\201\346\203\205\345\206\265/py3.9\346\224\257\346\214\201.md" +++ "b/\346\226\207\346\241\243/\345\212\237\350\203\275/Python\347\211\210\346\234\254\346\224\257\346\214\201\346\203\205\345\206\265/py3.9\346\224\257\346\214\201.md" @@ -11,7 +11,7 @@ Python 3.9.19 (main, Mar 20 2024, 18:08:17) [GCC 9.4.0] on linux 运行重现项目自身测试的结果与 Python 3.8 下的测试结果完全相同,包括警告信息。 -## 命令行参数行为对比测试 +## 反汇编字节码测试 使用`py3.8支持.md`文件中给出的`反汇编测试.ul`运行`木兰 --反汇编 反汇编测试.ul`,结果如下: -- Gitee From 5eeef08e0bb34ae1e097101ad652d28fad34d157 Mon Sep 17 00:00:00 2001 From: LY <51789698+Young-Lord@users.noreply.github.com> Date: Sat, 23 Mar 2024 22:30:42 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E2=80=9C=E9=80=82=E9=85=8D=E6=96=B0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E6=8C=87=E5=8D=97=E2=80=9D=EF=BC=8C=E5=AE=8C=E5=96=84`py3.9?= =?UTF-8?q?=E6=94=AF=E6=8C=81`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 31 +------ .../py3.9\346\224\257\346\214\201.md" | 6 +- ...10\346\234\254\346\214\207\345\215\227.md" | 92 +++++++++++++++++++ 3 files changed, 98 insertions(+), 31 deletions(-) create mode 100644 "\346\226\207\346\241\243/\345\212\237\350\203\275/Python\347\211\210\346\234\254\346\224\257\346\214\201\346\203\205\345\206\265/\351\200\202\351\205\215\346\226\260\347\211\210\346\234\254\346\214\207\345\215\227.md" diff --git a/README.md b/README.md index ecfc7bd..66a06d7 100644 --- a/README.md +++ b/README.md @@ -129,57 +129,28 @@ $ python -m 木兰 ```terminal $ python -m unittest 测试.unittest.交互 测试.unittest.语法树 测试.unittest.所有用例 测试.unittest.报错 测试.unittest.Python到木兰 -........ ----------------------------------------------------------------------- -Ran 12 tests in 2.000s - -OK ``` 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 以外其他系统下,会对从 PyPI 安装的版本进行测试: +以下测试语法相关用例。Windows 系统下会使用 木兰原始可执行文件(`ulang-0.2.2.exe`)测试,其他系统下则会使用 Python 安装的`木兰`进行测试: ```terminal $ python 测试/运行所有.py -通过: 运算/加.ul -…… -通过: 算法/排序/快速.ul -=================== -!全部通过! -本测试针对木兰原始可执行文件与重现项目的发布版。在此之前先运行`测试/unittest`下的集成测试。 ``` 以下测试源码生成相关用例: ```terminal $ python -m unittest 测试.unittest.原始可执行文件 -. ----------------------------------------------------------------------- -Ran 1 test in 53.000s - -OK ``` 以下测试木兰源码转换为 Python: ```terminal $ python -m unittest 测试.unittest.木兰到Python -加载文件 测试/unittest/源码生成/木兰到Python\AnnAssign.ul... -…… -加载文件 测试/unittest/源码生成/木兰到Python\输出nil.ul... -得到原始木兰生成结果中... -进度: (0/11) -比较 测试/unittest/源码生成/木兰到Python\AnnAssign.ul -…… -比较 测试/unittest/源码生成/木兰到Python\输出nil.ul -. ----------------------------------------------------------------------- -Ran 1 test in 12.000s - -OK ``` ## 许可证 diff --git "a/\346\226\207\346\241\243/\345\212\237\350\203\275/Python\347\211\210\346\234\254\346\224\257\346\214\201\346\203\205\345\206\265/py3.9\346\224\257\346\214\201.md" "b/\346\226\207\346\241\243/\345\212\237\350\203\275/Python\347\211\210\346\234\254\346\224\257\346\214\201\346\203\205\345\206\265/py3.9\346\224\257\346\214\201.md" index 0236b30..4b91d85 100644 --- "a/\346\226\207\346\241\243/\345\212\237\350\203\275/Python\347\211\210\346\234\254\346\224\257\346\214\201\346\203\205\345\206\265/py3.9\346\224\257\346\214\201.md" +++ "b/\346\226\207\346\241\243/\345\212\237\350\203\275/Python\347\211\210\346\234\254\346\224\257\346\214\201\346\203\205\345\206\265/py3.9\346\224\257\346\214\201.md" @@ -11,7 +11,11 @@ Python 3.9.19 (main, Mar 20 2024, 18:08:17) [GCC 9.4.0] on linux 运行重现项目自身测试的结果与 Python 3.8 下的测试结果完全相同,包括警告信息。 -## 反汇编字节码测试 +## 手工测试命令行选项功能 + +由于 `--语法树` 参数的差异已经在下文说明,且除了 `--反汇编` 选项以外,其他选项的行为在 Py3.9 和 Py3.8 版本间无明显差异,故仅列出 `--反汇编` 选项的输出结果。 + +### 反汇编字节码测试 使用`py3.8支持.md`文件中给出的`反汇编测试.ul`运行`木兰 --反汇编 反汇编测试.ul`,结果如下: diff --git "a/\346\226\207\346\241\243/\345\212\237\350\203\275/Python\347\211\210\346\234\254\346\224\257\346\214\201\346\203\205\345\206\265/\351\200\202\351\205\215\346\226\260\347\211\210\346\234\254\346\214\207\345\215\227.md" "b/\346\226\207\346\241\243/\345\212\237\350\203\275/Python\347\211\210\346\234\254\346\224\257\346\214\201\346\203\205\345\206\265/\351\200\202\351\205\215\346\226\260\347\211\210\346\234\254\346\214\207\345\215\227.md" new file mode 100644 index 0000000..90c0be8 --- /dev/null +++ "b/\346\226\207\346\241\243/\345\212\237\350\203\275/Python\347\211\210\346\234\254\346\224\257\346\214\201\346\203\205\345\206\265/\351\200\202\351\205\215\346\226\260\347\211\210\346\234\254\346\214\207\345\215\227.md" @@ -0,0 +1,92 @@ +# 适配新版本指南 + +## 本地安装 + +将代码库 clone 到本地后,在项目目录下执行: + +```bash +pip install -e . +``` + +> 此处的`-e`选项启用“开发者模式”(`Development Mode`),即在安装后,对代码库的修改会立即生效,无需重新安装。可参考[Development Mode (a.k.a. “Editable Installs”) - setuptools documentation](https://setuptools.pypa.io/en/latest/userguide/development_mode.html) + +(如果此命令报错,请继续阅读) + +## 适配新版本 + +### 更改 `setup.py` + +在`setup.py`中,将`python_requires`字段的值修改为新版本范围,例如: + +```python +python_requires='>=3.7, <3.10', +``` + +### 运行测试 + +根据`README.md`中说明完整运行测试,并解决可能出现的问题。注意,警告信息也应当尽量减少,或与维护者商议后决定不处理。 + +部分测试在 Windows 及 其它系统 下测试内容、结果可能不同,但应当保证在这二者下均能通过。 + +由于版本更新可能破坏旧版本兼容性,适配新版本时必须保证旧版本 Python 下也可通过所有测试。可以使用 [asdf](https://asdf-vm.com/) 或 [vfox](https://vfox.lhan.me/) 等版本管理器在多个 Python 版本间切换。 + +仅当测试全部通过后才应当提交代码。 + +以下为测试的示例结果。(注意,以下列出的 测试数量、时长、文件名 等可能会随时间改变): + +```terminal +$ python -m unittest 测试.unittest.交互 测试.unittest.语法树 测试.unittest.所有用例 测试.unittest.报错 测试.unittest.Python到木兰 +........ +---------------------------------------------------------------------- +Ran 12 tests in 2.000s + +OK +``` + +```terminal +$ python 测试/运行所有.py +通过: 运算/加.ul +…… +通过: 算法/排序/快速.ul +=================== +!全部通过! +本测试针对木兰原始可执行文件与重现项目的发布版。在此之前先运行`测试/unittest`下的集成测试。 +``` + +```terminal +$ python -m unittest 测试.unittest.原始可执行文件 +. +---------------------------------------------------------------------- +Ran 1 test in 53.000s + +OK +``` + +```terminal +$ python -m unittest 测试.unittest.木兰到Python +加载文件 测试/unittest/源码生成/木兰到Python\AnnAssign.ul... +…… +加载文件 测试/unittest/源码生成/木兰到Python\输出nil.ul... +得到原始木兰生成结果中... +进度: (0/11) +比较 测试/unittest/源码生成/木兰到Python\AnnAssign.ul +…… +比较 测试/unittest/源码生成/木兰到Python\输出nil.ul +. +---------------------------------------------------------------------- +Ran 1 test in 12.000s + +OK +``` + +### 手工测试命令行选项功能 + +对于`木兰`命令行工具,应当手工测试各个选项的功能,确保其在新版本下仍能正常工作,并记录行为差异。具体测试方法可以参考[py3.8支持.md](py3.8%E6%94%AF%E6%8C%81.md#%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0%E8%A1%8C%E4%B8%BA%E5%AF%B9%E6%AF%94%E6%B5%8B%E8%AF%95)。 + +### 更新版本、编写文档 + +在当前目录下,参考`py3.8支持.md`记录适配新版本的过程,包括以上数个方面的更改。 + +在根目录下的`setup.py`及相关文件中,更新本项目的版本号。 + +在`CHANGELOG.md`中,记录本次更新的内容。 -- Gitee From 7bac2a2e16c463800df1ec43ceb8c0e3ef4a31ec Mon Sep 17 00:00:00 2001 From: LY <51789698+Young-Lord@users.noreply.github.com> Date: Sun, 24 Mar 2024 07:56:36 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9A=E5=9C=A8?= =?UTF-8?q?=E2=80=9C=E5=BC=80=E5=8F=91=E4=B8=8A=E6=89=8B=E2=80=9D=E4=B8=AD?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E2=80=9C=E9=80=82=E9=85=8D=E6=96=B0=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E6=8C=87=E5=8D=97=E2=80=9D=E7=9A=84=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\345\274\200\345\217\221\344\270\212\346\211\213.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/\346\226\207\346\241\243/\345\274\200\345\217\221\344\270\212\346\211\213.md" "b/\346\226\207\346\241\243/\345\274\200\345\217\221\344\270\212\346\211\213.md" index 4a9df6f..be59723 100644 --- "a/\346\226\207\346\241\243/\345\274\200\345\217\221\344\270\212\346\211\213.md" +++ "b/\346\226\207\346\241\243/\345\274\200\345\217\221\344\270\212\346\211\213.md" @@ -17,6 +17,10 @@ commit,[如这个 super 语法](https://gitee.com/MulanRevive/mulan-rework/com 标识符命名方面,本项目现在尽量使用中文命名。如测试顺利且命名风格一致,在[语法说明文档](语法说明.md)中添加该语法,就可提交 pull request。 +### 适配新 Python 版本 + +Python 版本更新后,语法树节点、错误提示等可能有所变化,导致本项目运行效果不佳。此时,可以通过 [适配新版本指南](Python版本支持情况/适配新版本指南.md) 中的指南进行更新。 + ## 项目结构 ### 概要 -- Gitee From cad54d01e17746b4f7b54422a683663e08b36150 Mon Sep 17 00:00:00 2001 From: LY <51789698+Young-Lord@users.noreply.github.com> Date: Sun, 24 Mar 2024 14:05:35 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=9D=97=E8=AF=AD=E8=A8=80=E6=A0=87=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 ++++++++-------- ...1\210\346\234\254\346\214\207\345\215\227.md" | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 66a06d7..77ec95a 100644 --- a/README.md +++ b/README.md @@ -127,8 +127,8 @@ $ python -m 木兰 1. 重现项目自身测试 -```terminal -$ python -m unittest 测试.unittest.交互 测试.unittest.语法树 测试.unittest.所有用例 测试.unittest.报错 测试.unittest.Python到木兰 +```shell +python -m unittest 测试.unittest.交互 测试.unittest.语法树 测试.unittest.所有用例 测试.unittest.报错 测试.unittest.Python到木兰 ``` 2. 原始木兰可执行文件测试 @@ -137,20 +137,20 @@ $ python -m unittest 测试.unittest.交互 测试.unittest.语法树 测试.uni 以下测试语法相关用例。Windows 系统下会使用 木兰原始可执行文件(`ulang-0.2.2.exe`)测试,其他系统下则会使用 Python 安装的`木兰`进行测试: -```terminal -$ python 测试/运行所有.py +```shell +python 测试/运行所有.py ``` 以下测试源码生成相关用例: -```terminal -$ python -m unittest 测试.unittest.原始可执行文件 +```shell +python -m unittest 测试.unittest.原始可执行文件 ``` 以下测试木兰源码转换为 Python: -```terminal -$ python -m unittest 测试.unittest.木兰到Python +```shell +python -m unittest 测试.unittest.木兰到Python ``` ## 许可证 diff --git "a/\346\226\207\346\241\243/\345\212\237\350\203\275/Python\347\211\210\346\234\254\346\224\257\346\214\201\346\203\205\345\206\265/\351\200\202\351\205\215\346\226\260\347\211\210\346\234\254\346\214\207\345\215\227.md" "b/\346\226\207\346\241\243/\345\212\237\350\203\275/Python\347\211\210\346\234\254\346\224\257\346\214\201\346\203\205\345\206\265/\351\200\202\351\205\215\346\226\260\347\211\210\346\234\254\346\214\207\345\215\227.md" index 90c0be8..b182dde 100644 --- "a/\346\226\207\346\241\243/\345\212\237\350\203\275/Python\347\211\210\346\234\254\346\224\257\346\214\201\346\203\205\345\206\265/\351\200\202\351\205\215\346\226\260\347\211\210\346\234\254\346\214\207\345\215\227.md" +++ "b/\346\226\207\346\241\243/\345\212\237\350\203\275/Python\347\211\210\346\234\254\346\224\257\346\214\201\346\203\205\345\206\265/\351\200\202\351\205\215\346\226\260\347\211\210\346\234\254\346\214\207\345\215\227.md" @@ -4,7 +4,7 @@ 将代码库 clone 到本地后,在项目目录下执行: -```bash +```shell pip install -e . ``` -- Gitee From 5015f1c4fc4e761d6c3c23c8cdc540804bfe66ec Mon Sep 17 00:00:00 2001 From: LY <51789698+Young-Lord@users.noreply.github.com> Date: Sun, 24 Mar 2024 14:07:48 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E4=B8=BA=20Python=203.9=20=E8=AF=AD?= =?UTF-8?q?=E6=B3=95=E6=A0=91=E6=9B=B4=E6=94=B9=E6=B7=BB=E5=8A=A0=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=94=A8=E4=BE=8B=EF=BC=9B=E4=B8=8D=E4=B8=BA=20Python?= =?UTF-8?q?=203.7=20=E5=BA=94=E7=94=A8=E6=AD=A4=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6\263\225\345\210\206\346\236\220\345\231\250.py" | 12 +++++------- ...1\224\256\345\255\227\345\217\202\346\225\260.ul" | 1 + .../\350\257\255\346\263\225\346\240\221.py" | 2 ++ 3 files changed, 8 insertions(+), 7 deletions(-) create mode 100644 "\346\265\213\350\257\225/unittest/\344\276\213\347\250\213/\345\205\263\351\224\256\345\255\227\345\217\202\346\225\260.ul" diff --git "a/\346\234\250\345\205\260/\345\210\206\346\236\220\345\231\250/\350\257\255\346\263\225\345\210\206\346\236\220\345\231\250.py" "b/\346\234\250\345\205\260/\345\210\206\346\236\220\345\231\250/\350\257\255\346\263\225\345\210\206\346\236\220\345\231\250.py" index 4ddb1b2..cc5a966 100644 --- "a/\346\234\250\345\205\260/\345\210\206\346\236\220\345\231\250/\350\257\255\346\263\225\345\210\206\346\236\220\345\231\250.py" +++ "b/\346\234\250\345\205\260/\345\210\206\346\236\220\345\231\250/\350\257\255\346\263\225\345\210\206\346\236\220\345\231\250.py" @@ -860,14 +860,12 @@ class 语法分析器: if 键 is None: 各参数.append(值) else: - 关键词.append( - ast.keyword( - arg=键, - value=值, - lineno=语法树.取行号(片段), - col_offset=语法树.取列号(片段) + 位置参数 = {} + if python3版本号 >= 8: + 位置参数.update( + lineno=语法树.取行号(片段), col_offset=语法树.取列号(片段) ) - ) + 关键词.append(ast.keyword(arg=键, value=值, **位置参数)) return 语法树.新节点( 语法.调用, diff --git "a/\346\265\213\350\257\225/unittest/\344\276\213\347\250\213/\345\205\263\351\224\256\345\255\227\345\217\202\346\225\260.ul" "b/\346\265\213\350\257\225/unittest/\344\276\213\347\250\213/\345\205\263\351\224\256\345\255\227\345\217\202\346\225\260.ul" new file mode 100644 index 0000000..ec251b0 --- /dev/null +++ "b/\346\265\213\350\257\225/unittest/\344\276\213\347\250\213/\345\205\263\351\224\256\345\255\227\345\217\202\346\225\260.ul" @@ -0,0 +1 @@ +f(x=1) \ No newline at end of file diff --git "a/\346\265\213\350\257\225/unittest/\350\257\255\346\263\225\346\240\221.py" "b/\346\265\213\350\257\225/unittest/\350\257\255\346\263\225\346\240\221.py" index fe2497b..442c2f8 100644 --- "a/\346\265\213\350\257\225/unittest/\350\257\255\346\263\225\346\240\221.py" +++ "b/\346\265\213\350\257\225/unittest/\350\257\255\346\263\225\346\240\221.py" @@ -42,6 +42,7 @@ class test语法树(unittest.TestCase): "指定函数类型.ul": r"Module(body=[FunctionDef(name='hello', args=arguments(args=[arg(arg='p', annotation=Name(id='int', ctx=Load(), lineno=1, col_offset=16), lineno=1, col_offset=12)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Return(value=Name(id='p', ctx=Load(), lineno=2, col_offset=10), lineno=2, col_offset=3)], decorator_list=[], returns=Name(id='int', ctx=Load(), lineno=1, col_offset=23), lineno=1, col_offset=1)])", "顺便处理各表达式前缀.ul": r"Module(body=[With(items=[withitem(context_expr=Name(id='c', ctx=Load(), lineno=1, col_offset=9), optional_vars=Tuple(elts=[Name(id='a', ctx=Load(), lineno=1, col_offset=5), Name(id='b', ctx=Load(), lineno=1, col_offset=7)], ctx=Store(), lineno=1, col_offset=5))], body=[Pass( lineno=1, col_offset=11)], lineno=1, col_offset=1)])", "善后.ul": r"Module(body=[Try(body=[Pass( lineno=1, col_offset=5)], handlers=[Pass( lineno=1, col_offset=5)], orelse=[], finalbody=[Pass( lineno=1, col_offset=16)], lineno=1, col_offset=1)])", + "关键字参数.ul": r"Module(body=[Expr(value=Call(func=Name(id='f', ctx=Load(), lineno=1, col_offset=1), args=[], keywords=[keyword(arg='x', value=Num(n=1, lineno=1, col_offset=5))], lineno=1, col_offset=1), lineno=1, col_offset=1)])", } 期望值_3_8 = { @@ -56,6 +57,7 @@ class test语法树(unittest.TestCase): "指定函数类型.ul": r"Module(body=[FunctionDef(name='hello', args=arguments(posonlyargs=[], args=[arg(arg='p', annotation=Name(id='int', ctx=Load(), lineno=1, col_offset=16), lineno=1, col_offset=12)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Return(value=Name(id='p', ctx=Load(), lineno=2, col_offset=10), lineno=2, col_offset=3)], decorator_list=[], returns=Name(id='int', ctx=Load(), lineno=1, col_offset=23), lineno=1, col_offset=1)], type_ignores=[])", "顺便处理各表达式前缀.ul": r"Module(body=[With(items=[withitem(context_expr=Name(id='c', ctx=Load(), lineno=1, col_offset=9), optional_vars=Tuple(elts=[Name(id='a', ctx=Load(), lineno=1, col_offset=5), Name(id='b', ctx=Load(), lineno=1, col_offset=7)], ctx=Store(), lineno=1, col_offset=5))], body=[Pass(lineno=1, col_offset=11)], lineno=1, col_offset=1)], type_ignores=[])", "善后.ul": r"Module(body=[Try(body=[Pass(lineno=1, col_offset=5)], handlers=[Pass(lineno=1, col_offset=5)], orelse=[], finalbody=[Pass(lineno=1, col_offset=16)], lineno=1, col_offset=1)], type_ignores=[])", + "关键字参数.ul": r"Module(body=[Expr(value=Call(func=Name(id='f', ctx=Load(), lineno=1, col_offset=1), args=[], keywords=[keyword(arg='x', value=Constant(value=1, lineno=1, col_offset=5), lineno=1, col_offset=1)], lineno=1, col_offset=1), lineno=1, col_offset=1)], type_ignores=[])", } 期望值_3_9 = 期望值_3_8.copy() -- Gitee