常见问题
十五个最常被问到的问题。答案都在前面的章节里有详细展开,这里给最短路径。
入门
1. PuXian 和 Python 语法像吗?
像在缩进、def、if/elif/else、列表字典的写法;不同在没有异常、没有类、字符串拼接要显式 str()、除法返回浮点但位运算只吃整数。
2. 为什么我的 main 跑了两遍?
因为文件末尾多写了一行 main()。语言会自动调用 def main(),删掉那行即可。
3. 要不要装虚拟环境 / 配 PATH?
不需要。解释器就是 px,依赖是文件。唯一要注意的是在解压目录外跑时设 PX_STDLIB 指向 stdlib/。
语法与类型
4. 为什么会报「期望变量名,实际得到 from」?
from 和 in 是保留字。改成 sender / item 之类。
5. 有没有三元表达式?
没有。a if c else b 和 c ? a : b 都不支持。先算好变量再用。
6. 为什么 2 ** 64 得到 0?
整数是 64 位有符号,溢出按位回绕,不报错。需要大数用生态包 big。
7. 为什么 "x" + 1 报错,Python 却不报?
语言不做隐式转换。所有拼接前显式 str()。好处是输出永远不会意外变成 x1。
8. 函数里改了全局变量,为什么外面也变了?
规则是:用 var 声明 = 局部变量;直接赋值 = 改已存在的外层变量。不想改外层就加 var。
运行与工具
9. px run 和 px build 差多少?
一个 10 万次的循环:解释 5.2–5.9 秒,编译后 10–12 毫秒。约 500 倍。生产一律用编译产物。
10. px run --fast 报「找不到模块 E3005」怎么办?
import 写错了。0.2.379 起 --fast 能解析 import,且是严格模式:import "strings.px" 这种写法会直接失败,正确写法是 import std.strings(点分、不带引号);本地文件才用带引号的相对路径。同一脚本用 px run(解释轨)可能只打警告照常跑,所以以 --fast 的报错为准。
11. 报错里 1:11 是什么意思?
第 1 行第 11 列。列号很重要,别只看行号。
12. 段错误(Segmentation fault)是怎么回事?
最常见的原因是自定义函数与内建同名(例如 def env(...)),函数体里再调 env() 就成了无限递归。改个名即可。
部署与接口
13. 写 Web 接口要自己起服务吗?
不用。把 .px 交给 Ma 的 px_routes,脚本读环境变量与 /dev/stdin,往 /dev/stdout 写 Status: + 头 + 空行 + 体。
14. 为什么接口返回的内容前面多了一行日志?
因为用了 print 打日志——在 px_routes 里 print 写的就是响应体。日志改走 /dev/stderr。
15. 部署到 Ma 后报「未定义变量」,本地却正常?
脚本里跨目录 import 了(import "../lib/x.px")。Ma 编译只打包脚本所在目录,跨目录目标不存在。把公共库复制进本目录,用同目录相对路径。
还有问题?
| 想做的事 | 去哪看 |
|---|---|
| 某个函数怎么用 | 内建函数速查;或直接看 /usr/share/puxian/stdlib/*.px 源码 |
| 报错看不懂 | 错误码速查 |
| 要找特定能力的包 | 标准库概览 与 registry |
| 写接口 | 写一个 Web 接口 |
| 性能不行 | 性能与陷阱 |
px lint;遇到"跑起来报未定义",先查 import;遇到"线上慢十倍",先确认是不是解释轨。