pythonalize 0.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Pythonalize contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,258 @@
1
+ Metadata-Version: 2.4
2
+ Name: pythonalize
3
+ Version: 0.0.1
4
+ Summary: Pythonalize: a localized representation layer for Python (Simplified Chinese).
5
+ License: MIT License
6
+
7
+ Copyright (c) 2026 Pythonalize contributors
8
+
9
+ Permission is hereby granted, free of charge, to any person obtaining a copy
10
+ of this software and associated documentation files (the "Software"), to deal
11
+ in the Software without restriction, including without limitation the rights
12
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ copies of the Software, and to permit persons to whom the Software is
14
+ furnished to do so, subject to the following conditions:
15
+
16
+ The above copyright notice and this permission notice shall be included in all
17
+ copies or substantial portions of the Software.
18
+
19
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
+ SOFTWARE.
26
+
27
+ Requires-Python: >=3.9
28
+ Description-Content-Type: text/markdown
29
+ License-File: LICENSE
30
+ Dynamic: license-file
31
+
32
+ # Pythonalize
33
+
34
+ **Pythonalize** 是 Python 的本地化表示层:让你用简体中文写 Python。
35
+
36
+ 它不是新语言,也不是翻译器之外的东西。它只做一件事——把中文写法的
37
+ Python 源码,换成等价的英文 Python 源码,再交给 Python 执行。
38
+
39
+ - 面向:想用中文阅读/编写 Python 的人,以及用 AI 快速出代码的 **vibe coder**。
40
+ - 它**降低源码的阅读门槛**,但**不会替代 Python 概念学习**——你要理解
41
+ 什么是函数、循环、类,仍是学 Python 本身。
42
+
43
+ ---
44
+
45
+ ## Pythonalize 是什么 / 不是什么
46
+
47
+ **是:**
48
+
49
+ - Python 的一个 **本地化表示层**——中文只是 Python 关键字/内置名的另一种写法。
50
+ - 一个用 `tokenize` 做**词法映射**的小工具:把中文 token 换成英文 token。
51
+
52
+ **不是:**
53
+
54
+ - ❌ 一门**新语言**。
55
+ - ❌ 一个新的 **runtime / 解释器**。
56
+ - ❌ 一个新的 **VM**。
57
+ - ❌ 一个 **compiler**(它只是把源码换成等价源码,不生成机器码)。
58
+ - ❌ 一个**独立的 package ecosystem**(你不用装另一套包管理器)。
59
+ - ❌ 一个**自然语言编程**系统(它是词法映射,不是理解你的程序意图)。
60
+
61
+ **黄金规则:** Python 的 **grammar(语法)和 semantics(语义)是唯一标准**。
62
+ Pythonalize 只改变字面写法,完全不改变 Python 的语法与运行语义。
63
+
64
+ > **Pythonalize does not define program semantics. Python does.**
65
+
66
+ ---
67
+
68
+ ## 中英混写与标识符
69
+
70
+ - 可以**中英混写**:中文词换英文词,其余一律原样保留。
71
+ - **字符串、注释、数字** 绝不会被替换。
72
+ - **项目自定义的中文 Unicode 标识符**(如函数名、变量名、类名)**不被猜译**,
73
+ 原样保留。Pythonalize 只替换它内置映射表里的那几十个词。
74
+
75
+ ---
76
+
77
+ ## 版本
78
+
79
+ - `v0.0.1` 目前**仅支持 `zh-CN`**(简体中文)一个语言。
80
+ - 其他语言 / 更多词表将在后续版本加入。
81
+
82
+ ---
83
+
84
+ ## 安装
85
+
86
+ 安装发布版:
87
+
88
+ ```bash
89
+ pip install pythonalize
90
+ ```
91
+
92
+ 从 PyPI 安装 `pythonalize` 发布版,执行需要 Python 3.9 及以上。
93
+
94
+ 从源码开发安装(在项目根目录执行):
95
+
96
+ ```bash
97
+ pip install .
98
+ ```
99
+
100
+ 这会从当前源码安装,是开发时用到的方式;执行同样需要 Python 3.9 及以上。
101
+
102
+ 安装后,`pthz` 命令进入 PATH(由 `pyproject.toml` 的 `[project.scripts]` 提供)。
103
+
104
+ ---
105
+
106
+ ## Hello 示例
107
+
108
+ `examples/hello.pthz`:
109
+
110
+ ```python
111
+ 定义 主():
112
+ 打印("你好,世界")
113
+
114
+ 若 __name__ == "__main__":
115
+ 主()
116
+ ```
117
+
118
+ 它等价于 `examples/hello.py`:
119
+
120
+ ```python
121
+ def main():
122
+ print("你好,世界")
123
+
124
+ if __name__ == "__main__":
125
+ main()
126
+ ```
127
+
128
+ 两个文件**语义等价**,运行都输出:
129
+
130
+ ```text
131
+ 你好,世界
132
+ ```
133
+
134
+ ---
135
+
136
+ ## 命令
137
+
138
+ 所有命令都是 `pthz` 的子命令。
139
+
140
+ ### 运行(默认)
141
+
142
+ ```bash
143
+ pthz examples/hello.pthz # 裸文件 = run
144
+ pthz run examples/hello.pthz # 等价
145
+ ```
146
+
147
+ ### 查看规范化结果(推荐先看再跑)
148
+
149
+ ```bash
150
+ pthz show examples/hello.pthz
151
+ ```
152
+
153
+ 把 `.pthz` 规范化后的等价 Python 打印到屏幕,方便你**审阅**。
154
+
155
+ ### 语法检查
156
+
157
+ ```bash
158
+ pthz check examples/hello.pthz
159
+ ```
160
+
161
+ 只编译、不执行。成功打印 `OK: examples/hello.pthz`。
162
+
163
+ ### 双向转换
164
+
165
+ **注意:** 目标文件默认是源文件同名的另一后缀(`hello.pthz` ↔ `hello.py`)。
166
+ 如果目标**已存在**,命令会拒绝(`-y` 也不会覆盖)。仓库自带的
167
+ `examples/hello.py` 与 `examples/hello.pthz` **同时存在**,因此不要把其中
168
+ 一个当另一个的转换目标——先复制到一个**目标初始不存在**的新目录。
169
+
170
+ 下面的示例分成两个相互独立的目录,每个方向只执行一条命令,可整段照抄。
171
+
172
+ **`.pthz` → `.py`(中文写 → 英文写),用 `from-pthz/`:**
173
+
174
+ ```bash
175
+ mkdir -p from-pthz && cp examples/hello.pthz from-pthz/
176
+ pthz normalize -y from-pthz/hello.pthz # 创建 from-pthz/hello.py
177
+ ```
178
+
179
+ **`.py` → `.pthz`(英文写 → 中文写),用 `from-py/`:**
180
+
181
+ ```bash
182
+ mkdir -p from-py && cp examples/hello.py from-py/
183
+ pthz represent -y from-py/hello.py # 创建 from-py/hello.pthz
184
+ ```
185
+
186
+ > 上面用 `-y` 跳过确认、直接创建。去掉 `-y` 会先显示
187
+ > `Create <TARGET>? [y/N]: ` 提示,等你在输入 `y` 或 `Y` 之后才创建。
188
+
189
+ 转换行为:
190
+
191
+ - 目标文件默认是源文件同名的另一后缀(`hello.pthz` ↔ `hello.py`)。
192
+ - 目标**已存在时拒绝**,只报 `Error: <TARGET> already exists.` 并返回非零。
193
+ - **`-y` 也不会覆盖已有文件**,它只是跳过“是否创建?”的询问。
194
+ - 没有 `-y` 时会询问 `Create <TARGET>? [y/N]: `,只有输入 `y` 或 `Y`
195
+ 才创建;回答其他内容则正常退出(返回 0)。
196
+
197
+ ### 帮助与版本
198
+
199
+ ```bash
200
+ pthz --help
201
+ pthz --version
202
+ ```
203
+
204
+ `pthz --help` 列出全部子命令与参数;`pthz --version` 打印当前版本
205
+ (`pthz 0.0.1`)。
206
+
207
+ ---
208
+
209
+ ## 一个需要知道的坑:内置名遮蔽也会被替换
210
+
211
+ Pythonalize 是**纯词法映射**,不追踪变量绑定。
212
+
213
+ 也就是说:即使你在代码里把一个内置名(如 `print`、`len`、`range`)
214
+ 当普通变量重新赋值了,它的那个名字**依然会被替换**成对应的中文词。
215
+ 它**无法识别 shadowing(遮蔽)**。
216
+
217
+ 如果你要遮蔽内置名,请注意:被替换的仍然是那个词法 token。
218
+
219
+ ```python
220
+ # .py 里:把 print 重新赋值,再调用
221
+ print = my_logger # 这个 print 会被替换成 打印
222
+ print("hi") # 这个也会被替换成 打印
223
+ ```
224
+
225
+ ---
226
+
227
+ ## ⚠️ 安全提示:不是沙箱
228
+
229
+ **执行 `.pthz` 与执行等价 `.py` 一样不安全。**
230
+
231
+ - Pythonalize **不是沙箱**,没有隔离能力。
232
+ - 被运行的代码拥有与你完全相同的权限:能读写文件、访问网络、调用系统命令。
233
+ - **运行前**请务必先用 `pthz show` 查看规范化结果、再用 `pthz check`,
234
+ 并**审阅**代码内容,尤其是你从 AI 或其他渠道获得的代码。
235
+
236
+ ---
237
+
238
+ ## 给 AI 生成代码的建议
239
+
240
+ 如果你用 AI 帮你写 Pythonalize 代码:
241
+
242
+ - 直接告诉它:“用 Pythonalize 写,输出 **`.pthz`**,语法就是 Python,只是把
243
+ `def/if/for/print` 等词换成了中文对应词。”
244
+ - 让它**先写 `.pthz`**,你再 `pthz show` 检查;或让它**同时给 `.py`**,
245
+ 你用 `pthz represent` 转成 `.pthz` 再运行。
246
+ - ⚠️ 交代它:**不要编造 Pythonalize 不存在的语法**;Pythonalize 只用标准 Python
247
+ 语法,只是关键字/内置名是中文。
248
+ - 让 AI 遵守 `zh-CN` 当前词表(`定义/若/否则若/否则/返回/遍历/只要/停止/
249
+ 继续/在/是/非/且/或/从/作为/类/略过/打印/长度/范围/枚举/总和/最小/最大...
250
+ 等),避免它发明新词。
251
+ - 提醒它:**项目自定义的中文标识符、字符串、注释不会被翻译**,别假设会被猜译。
252
+ - **别让 AI 在没有审阅的情况下直接运行**外部代码——先 `show`/`check` 再看。
253
+
254
+ ---
255
+
256
+ ## License
257
+
258
+ MIT —— 详见 [`LICENSE`](LICENSE)。
@@ -0,0 +1,227 @@
1
+ # Pythonalize
2
+
3
+ **Pythonalize** 是 Python 的本地化表示层:让你用简体中文写 Python。
4
+
5
+ 它不是新语言,也不是翻译器之外的东西。它只做一件事——把中文写法的
6
+ Python 源码,换成等价的英文 Python 源码,再交给 Python 执行。
7
+
8
+ - 面向:想用中文阅读/编写 Python 的人,以及用 AI 快速出代码的 **vibe coder**。
9
+ - 它**降低源码的阅读门槛**,但**不会替代 Python 概念学习**——你要理解
10
+ 什么是函数、循环、类,仍是学 Python 本身。
11
+
12
+ ---
13
+
14
+ ## Pythonalize 是什么 / 不是什么
15
+
16
+ **是:**
17
+
18
+ - Python 的一个 **本地化表示层**——中文只是 Python 关键字/内置名的另一种写法。
19
+ - 一个用 `tokenize` 做**词法映射**的小工具:把中文 token 换成英文 token。
20
+
21
+ **不是:**
22
+
23
+ - ❌ 一门**新语言**。
24
+ - ❌ 一个新的 **runtime / 解释器**。
25
+ - ❌ 一个新的 **VM**。
26
+ - ❌ 一个 **compiler**(它只是把源码换成等价源码,不生成机器码)。
27
+ - ❌ 一个**独立的 package ecosystem**(你不用装另一套包管理器)。
28
+ - ❌ 一个**自然语言编程**系统(它是词法映射,不是理解你的程序意图)。
29
+
30
+ **黄金规则:** Python 的 **grammar(语法)和 semantics(语义)是唯一标准**。
31
+ Pythonalize 只改变字面写法,完全不改变 Python 的语法与运行语义。
32
+
33
+ > **Pythonalize does not define program semantics. Python does.**
34
+
35
+ ---
36
+
37
+ ## 中英混写与标识符
38
+
39
+ - 可以**中英混写**:中文词换英文词,其余一律原样保留。
40
+ - **字符串、注释、数字** 绝不会被替换。
41
+ - **项目自定义的中文 Unicode 标识符**(如函数名、变量名、类名)**不被猜译**,
42
+ 原样保留。Pythonalize 只替换它内置映射表里的那几十个词。
43
+
44
+ ---
45
+
46
+ ## 版本
47
+
48
+ - `v0.0.1` 目前**仅支持 `zh-CN`**(简体中文)一个语言。
49
+ - 其他语言 / 更多词表将在后续版本加入。
50
+
51
+ ---
52
+
53
+ ## 安装
54
+
55
+ 安装发布版:
56
+
57
+ ```bash
58
+ pip install pythonalize
59
+ ```
60
+
61
+ 从 PyPI 安装 `pythonalize` 发布版,执行需要 Python 3.9 及以上。
62
+
63
+ 从源码开发安装(在项目根目录执行):
64
+
65
+ ```bash
66
+ pip install .
67
+ ```
68
+
69
+ 这会从当前源码安装,是开发时用到的方式;执行同样需要 Python 3.9 及以上。
70
+
71
+ 安装后,`pthz` 命令进入 PATH(由 `pyproject.toml` 的 `[project.scripts]` 提供)。
72
+
73
+ ---
74
+
75
+ ## Hello 示例
76
+
77
+ `examples/hello.pthz`:
78
+
79
+ ```python
80
+ 定义 主():
81
+ 打印("你好,世界")
82
+
83
+ 若 __name__ == "__main__":
84
+ 主()
85
+ ```
86
+
87
+ 它等价于 `examples/hello.py`:
88
+
89
+ ```python
90
+ def main():
91
+ print("你好,世界")
92
+
93
+ if __name__ == "__main__":
94
+ main()
95
+ ```
96
+
97
+ 两个文件**语义等价**,运行都输出:
98
+
99
+ ```text
100
+ 你好,世界
101
+ ```
102
+
103
+ ---
104
+
105
+ ## 命令
106
+
107
+ 所有命令都是 `pthz` 的子命令。
108
+
109
+ ### 运行(默认)
110
+
111
+ ```bash
112
+ pthz examples/hello.pthz # 裸文件 = run
113
+ pthz run examples/hello.pthz # 等价
114
+ ```
115
+
116
+ ### 查看规范化结果(推荐先看再跑)
117
+
118
+ ```bash
119
+ pthz show examples/hello.pthz
120
+ ```
121
+
122
+ 把 `.pthz` 规范化后的等价 Python 打印到屏幕,方便你**审阅**。
123
+
124
+ ### 语法检查
125
+
126
+ ```bash
127
+ pthz check examples/hello.pthz
128
+ ```
129
+
130
+ 只编译、不执行。成功打印 `OK: examples/hello.pthz`。
131
+
132
+ ### 双向转换
133
+
134
+ **注意:** 目标文件默认是源文件同名的另一后缀(`hello.pthz` ↔ `hello.py`)。
135
+ 如果目标**已存在**,命令会拒绝(`-y` 也不会覆盖)。仓库自带的
136
+ `examples/hello.py` 与 `examples/hello.pthz` **同时存在**,因此不要把其中
137
+ 一个当另一个的转换目标——先复制到一个**目标初始不存在**的新目录。
138
+
139
+ 下面的示例分成两个相互独立的目录,每个方向只执行一条命令,可整段照抄。
140
+
141
+ **`.pthz` → `.py`(中文写 → 英文写),用 `from-pthz/`:**
142
+
143
+ ```bash
144
+ mkdir -p from-pthz && cp examples/hello.pthz from-pthz/
145
+ pthz normalize -y from-pthz/hello.pthz # 创建 from-pthz/hello.py
146
+ ```
147
+
148
+ **`.py` → `.pthz`(英文写 → 中文写),用 `from-py/`:**
149
+
150
+ ```bash
151
+ mkdir -p from-py && cp examples/hello.py from-py/
152
+ pthz represent -y from-py/hello.py # 创建 from-py/hello.pthz
153
+ ```
154
+
155
+ > 上面用 `-y` 跳过确认、直接创建。去掉 `-y` 会先显示
156
+ > `Create <TARGET>? [y/N]: ` 提示,等你在输入 `y` 或 `Y` 之后才创建。
157
+
158
+ 转换行为:
159
+
160
+ - 目标文件默认是源文件同名的另一后缀(`hello.pthz` ↔ `hello.py`)。
161
+ - 目标**已存在时拒绝**,只报 `Error: <TARGET> already exists.` 并返回非零。
162
+ - **`-y` 也不会覆盖已有文件**,它只是跳过“是否创建?”的询问。
163
+ - 没有 `-y` 时会询问 `Create <TARGET>? [y/N]: `,只有输入 `y` 或 `Y`
164
+ 才创建;回答其他内容则正常退出(返回 0)。
165
+
166
+ ### 帮助与版本
167
+
168
+ ```bash
169
+ pthz --help
170
+ pthz --version
171
+ ```
172
+
173
+ `pthz --help` 列出全部子命令与参数;`pthz --version` 打印当前版本
174
+ (`pthz 0.0.1`)。
175
+
176
+ ---
177
+
178
+ ## 一个需要知道的坑:内置名遮蔽也会被替换
179
+
180
+ Pythonalize 是**纯词法映射**,不追踪变量绑定。
181
+
182
+ 也就是说:即使你在代码里把一个内置名(如 `print`、`len`、`range`)
183
+ 当普通变量重新赋值了,它的那个名字**依然会被替换**成对应的中文词。
184
+ 它**无法识别 shadowing(遮蔽)**。
185
+
186
+ 如果你要遮蔽内置名,请注意:被替换的仍然是那个词法 token。
187
+
188
+ ```python
189
+ # .py 里:把 print 重新赋值,再调用
190
+ print = my_logger # 这个 print 会被替换成 打印
191
+ print("hi") # 这个也会被替换成 打印
192
+ ```
193
+
194
+ ---
195
+
196
+ ## ⚠️ 安全提示:不是沙箱
197
+
198
+ **执行 `.pthz` 与执行等价 `.py` 一样不安全。**
199
+
200
+ - Pythonalize **不是沙箱**,没有隔离能力。
201
+ - 被运行的代码拥有与你完全相同的权限:能读写文件、访问网络、调用系统命令。
202
+ - **运行前**请务必先用 `pthz show` 查看规范化结果、再用 `pthz check`,
203
+ 并**审阅**代码内容,尤其是你从 AI 或其他渠道获得的代码。
204
+
205
+ ---
206
+
207
+ ## 给 AI 生成代码的建议
208
+
209
+ 如果你用 AI 帮你写 Pythonalize 代码:
210
+
211
+ - 直接告诉它:“用 Pythonalize 写,输出 **`.pthz`**,语法就是 Python,只是把
212
+ `def/if/for/print` 等词换成了中文对应词。”
213
+ - 让它**先写 `.pthz`**,你再 `pthz show` 检查;或让它**同时给 `.py`**,
214
+ 你用 `pthz represent` 转成 `.pthz` 再运行。
215
+ - ⚠️ 交代它:**不要编造 Pythonalize 不存在的语法**;Pythonalize 只用标准 Python
216
+ 语法,只是关键字/内置名是中文。
217
+ - 让 AI 遵守 `zh-CN` 当前词表(`定义/若/否则若/否则/返回/遍历/只要/停止/
218
+ 继续/在/是/非/且/或/从/作为/类/略过/打印/长度/范围/枚举/总和/最小/最大...
219
+ 等),避免它发明新词。
220
+ - 提醒它:**项目自定义的中文标识符、字符串、注释不会被翻译**,别假设会被猜译。
221
+ - **别让 AI 在没有审阅的情况下直接运行**外部代码——先 `show`/`check` 再看。
222
+
223
+ ---
224
+
225
+ ## License
226
+
227
+ MIT —— 详见 [`LICENSE`](LICENSE)。
@@ -0,0 +1,23 @@
1
+ [build-system]
2
+ requires = ["setuptools>=61.0"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "pythonalize"
7
+ version = "0.0.1"
8
+ description = "Pythonalize: a localized representation layer for Python (Simplified Chinese)."
9
+ readme = "README.md"
10
+ license = {file = "LICENSE"}
11
+ requires-python = ">=3.9"
12
+
13
+ [project.scripts]
14
+ pthz = "pythonalize.cli:main"
15
+
16
+ [tool.setuptools]
17
+ package-dir = {"" = "src"}
18
+
19
+ [tool.setuptools.packages.find]
20
+ where = ["src"]
21
+
22
+ [tool.setuptools.package-data]
23
+ pythonalize = ["schemes/*.json"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,5 @@
1
+ """Pythonalize: Python 的本地化表示层(简体中文)。"""
2
+
3
+ __version__ = "0.0.1"
4
+
5
+ __all__ = ["__version__"]
@@ -0,0 +1,5 @@
1
+ """``python -m pythonalize`` 入口,委托给 :func:`pythonalize.cli.main`。"""
2
+
3
+ from .cli import main
4
+
5
+ raise SystemExit(main())