资讯动态

Monty中如何使用datetime与json?常用内置能力与边界限制实测

发布时间:2026/8/30 11:29:17 来源:尧图企业网站定制
Monty中如何使用datetime与json常用内置能力与边界限制实测【免费下载链接】montyA minimal, secure Python interpreter written in Rust for use by AI项目地址: https://gitcode.com/GitHub_Trending/monty3/montyMonty 是一个用 Rust 编写的极简安全 Python 3.14 解释器专为安全执行 AI 生成的代码而设计。本文实测它内置的 datetime 与 json 两个模块常用能力怎么用、和 CPython 相比有哪些边界限制帮你写出不会踩坑的沙箱代码。为什么要在 Monty 里关注 datetime 和 jsonMonty 不是完整的 Python 环境——它刻意只提供一小块标准库子集asyncio、json、datetime、math、re、pathlib等并把文件系统、网络、环境变量全部隔离成宿主可控的外部调用。这意味着两个高频模块的行为和 CPython 存在微妙但关键的差异沙箱里能获取真实时间吗json.dumps还能用default回调兜底吗深度嵌套的 JSON 会不会被直接拒绝以下结论均来自仓库中的限制文档 limitations/datetime.md、limitations/json.md 与配套测试用例属于实测口径。datetime 模块四个类先记住能用什么Monty 的 datetime 模块提供四个类date、datetime、timedelta、timezone。模块级的time、tzinfo、MINYEAR/MAXYEAR不暴露。构造与常用方法核心用法和 CPython 基本一致测试用例 datetime__core.py 覆盖了绝大多数常规场景import datetime d datetime.date(2024, 6, 15) dt datetime.datetime(2024, 6, 15, 10, 30, 45, tzinfodatetime.timezone.utc) dt datetime.timedelta(hours5) # 时间加减 (dt - dt.replace(hour8)).total_seconds() # timedelta 算术 dt.isoformat() # 2024-06-15T10:30:0000:00几个和 CPython 不一致的细节写代码前值得记住now()是唯一能拿到宿主机时间的入口。它会产生一次外部调用date.today()、utcnow()、fromtimestamp()、fromordinal()、combine()均未实现timezone(tz)传入后返回的tzinfo满足但不是同一个对象is为 False。replace()只接受关键字参数。CPython 允许d.replace(2025)这样按位置传参Monty 会抛TypeError。timedelta的hours/minutes/milliseconds/weeks是关键字参数不能按位置传。两个timedelta之间的除法和整除未实现乘、加、减、比较都支持。年份超出 64 位整数范围时抛OverflowError: Python int too large to convert to C long所有平台口径一致。格式化strftime 与 f-string 的三个坑strftime走的是 Rust 的chrono格式化大部分指令正常但有三类边界行为详见 datetime__format.py场景Monty 行为CPython 行为无法识别的指令如%Q原样保留Linux 原样保留、macOS 去掉%纯date上用时间指令%H等抛ValueError: Invalid format string补零填充00naive 值上用%z/%Z抛ValueError输出空字符串f-string 格式化日期与 CPython 的__format__对齐f{dt:%Y-%m-%d}等价于dt.strftime(%Y-%m-%d)空规格则回退到str(dt)。json 模块loads / dumps 能力清单Monty 的 json 模块由手写的编码器与jiter解析器组成对支持的关键词组合做到与 CPython 逐字节一致。模块内只有三样东西loads、dumps和JSONDecodeError。json.loads无参数解析但有硬上限输入只接受str或bytes传别的类型抛TypeError。不接受任何关键字参数parse_float、object_hook、cls等一律TypeError。NaN/Infinity/-Infinity总是被接受没有关闭开关。嵌套深度上限200 层超了抛JSONDecodeError——这对防御恶意深层嵌套 JSON 是天然的资源保护。超大的 JSON 整数按int_max_str_digits语义抛ValueError而非JSONDecodeError与 CPython 一致。json.dumps支持 6 个关键词拒绝 3 个支持的关键词及 CPython 语义indent、sort_keys、ensure_ascii、allow_nan、separators、skipkeys。import json json.dumps({b: 1, a: 2}, sort_keysTrue) # {a: 2, b: 1} json.dumps(☃, ensure_asciiFalse) # ☃而以下调用方式会直接TypeErrorcls不支持自定义编码器类default没有兜底回调不可序列化的对象如set抛TypeError: Object of type set is not JSON serializablecheck_circular循环引用检测恒为开启自引用结构抛ValueError: Circular reference detected见 json__dumps_errors.py。另外两个实用特性dumps会把 dict 中bool/None/int/float类型的键自动转换成 JSON 允许的字符串键tuple 会输出为数组。json.load(fp)/json.dump(obj, fp)未实现——沙箱里没有文件对象协议。JSONDecodeError 的两个细节它继承自ValueError可以用except ValueError:捕获。沙箱内部它是只有消息的异常没有msg/doc/pos/lineno/colno属性但当它通过宿主 API如pydantic_monty抛回宿主侧时会被重建为带全部五个属性的真实json.JSONDecodeError超过 64 KiB 的文档除外此时doc为空字符串。速查Monty 里最容易被 CPython 习惯坑到的点想取当前日期 → 只能datetime.datetime.now(tz)没有date.today()replace()、timedelta大单位参数 → 必须写关键字形式strftime里别对纯date用时间指令也别对 naive 值用%zjson.loads一个参数都加不了深度别超 200 层json.dumps想自定义序列化 → 先在宿主侧把对象转成基础类型沙箱内没有default兜底类继承不可用所以datetime无法被子类化。延伸阅读datetime 差异全文limitations/datetime.mdjson 差异全文limitations/json.md模块实现crates/monty/src/modules/datetime.rs、crates/monty/src/modules/json/实测用例crates/monty/test_cases/datetime__core.py、crates/monty/test_cases/json__module.py沙箱资源限制说明docs/resource-limits.md【免费下载链接】montyA minimal, secure Python interpreter written in Rust for use by AI项目地址: https://gitcode.com/GitHub_Trending/monty3/monty创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价