px普贤教程PuXian
普贤教程 › AI 专用

硬规则清单

这一章按「可以整段拷贝进系统提示词」的标准写:每条都是可判定的规则,配一个反例。规则来自 2026 年 9–11 月在真实项目(Web 服务器、账号接口、云同步、静态站生成器)上踩过的故障。

一、语法

text
1. 函数定义用 def name():,不是 fn / func / function。
2. 缩进用 4 空格,同一块内不得混用 tab。
3. 输出用 print(...),不存在 println()。
4. 保留字不能做变量名或参数名:from、in、for、if、else、while、def、let、var、return、import、and、or、not、true、false、null。
   ✗ var from = "a@b"      ✓ var sender = "a@b"
5. 类型标注写在变量声明里:var n = 0 / let FIXED = 1;函数内 var 是局部,直接赋值改的是外层。
6. import "本地文件.px"(同目录);import "stdlib模块名";包用裸名 import mysql(来自 .px_modules/)。
7. def main() 会自动执行,不要自己再写一行 main() —— 那会跑两遍。
为什么反复强调保留字var from = ... 的报错是 E2001 期望变量名,实际得到 from,位置指向那一行,看上去很像别处的语法错误。2026-11-05 一次改动因为这个原因让 3 个文件同时编译失败。

二、类型与比较

text
8. 布尔是 bool,不是 0/1:false == 0 是 false。判断真假用 if x: / not x。
9. 字符串与数字不隐式转换:str(n) / int(s) / float(s),转换失败返回 Err 或运行时错误。
10. 整数除法 / 返回 float:int(a / b) 取整;不要指望 a / b 得到整数。
11. 2 ** 64 得 0 —— 64 位整数静默溢出回绕。大数先想清楚位宽。
12. bytes 与 string 是两种类型,相加报 R1002。bytes→string 用 bytes_to_str(),不要用 str()(会得到 "<bytes 1>")。
13. bytes 不可变:bytes_set() 返回新对象,不改原对象。

三、容器

text
14. 字典缺键是运行时错误 R1008,不是返回 null。取之前用 if d.has(k): 或 if contains(d, k):(没有 keys() 内建)
15. has() 用于字典取键判断;列表用 contains(list, x)。
16. join 的参数顺序是 join(分隔符, 列表),与 Python 相反。
17. 列表/字典是引用语义(赋值不复制,两个名字指向同一份数据):b = a 之后 b.append(x) 会改到 a。要独立副本,列表用 a[0:len(a)] 切片,字典用 for k in d 逐键复制;没有 clone()。

四、错误处理

text
18. 没有 try/catch/finally,写了就是语法错误。
19. 任何「用户/网络/文件」输入,优先用 _opt 后缀的内建:json_parse_opt / file_read_opt / …。
20. 无 _opt 可用的地方(如 json_parse、部分会抛错的内建)必须在调用前校验输入。
21. 运行期错误会终止当前协程(Coroutine),不是整个进程 —— 但错误日志容易被淹没,别指望它做控制流。

五、文件与 IO

text
22. read_file() 遇到 NUL 字节会截断:读二进制/上传内容用 open("/dev/stdin","r") + read_file_opt(...).ok()。
23. 写二进制用 write_bytes();write_file() 对 bytes 会写成字面 "<bytes N>"。
24. 二进制输出到 stdout 要显式 open("/dev/stdout","w") 再分块 write;write_all 单次超 16 MiB 会挂死。
25. bytes_find(b, sub) 未命中返回 null,不是 -1;且只接受 2 个参数,没有起点。
26. string 操作对含 NUL 的二进制不安全(split 会在 NUL 处截断)。

六、时间

text
27. now_ms() 是毫秒时间戳;time_format() 输出的是 UTC,不是本地时区。
28. 写数据库/日志要显式声明时区,别把 UTC 当 CST 用(差 8 小时,会让「未来时间」的队列一条都取不出来且不报错)。

七、并发

text
29. 并发用 spawn + chan,编译轨才真正并行;解释轨是协作式,看不到加速。
30. actor 的处理函数里要改多个字段时,用多行块并在末尾保留逗号,不要写成单表达式,否则语法错。

八、工具链与部署

text
31. 改完必须跑 px lint;跑通必须跑 px build(不能只跑 px run)。
32. 调试前先 /path/to/program --version,确认调的是新版。
33. Ma 的 px_routes 每个 pxapp 目录必须自包含(公共库要放实体副本,不能用 ../ 或软链)。
34. 在 px_routes 脚本里,print() 写的是 stdout —— 它就是 HTTP 响应体。日志一律写 /dev/stderr。
35. 响应头行必须以 \n 结尾;用 \r\n 时除 Content-Type 外全部会被丢掉。
36. 首页/接口的默认分支(mode:auto)首次请求走解释轨;逐像素、重循环类脚本必须显式 mode: fast。

九、别做的事

六条禁令
  • 不要凭空发明 API。不确定就先 pxpkg search 或直接写 5 行试。
  • 不要把 Python 惯用法直接搬过来:len() 不存在(用 len(x) 对字符串/列表可用,但 x.len() 不行)、dict.get() 不存在、f-string 不存在。
  • 不要在一个文件里混用「Python 风格」和「PuXian 风格」的错误处理。
  • 不要批量改多个文件而不逐个编译 —— 一个保留字能让一半文件同时挂掉。
  • 不要把解释轨的耗时当性能结论。
  • 不要在没有回滚方案时替换线上二进制。