拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Monty 的 Python 子集边界:限制文档(limitations)权威解读与源码佐证

Monty 的 Python 子集边界限制文档limitations权威解读与源码佐证【免费下载链接】montyA minimal, secure Python interpreter written in Rust for use by AI项目地址: https://gitcode.com/GitHub_Trending/monty3/montyMonty 是一个用 Rust 编写、专为 AI 场景设计的最小化安全 Python 解释器。它不是追求完备性的 CPython 实现而是刻意实现足够让模型表达意图的 Python 子集。本文以仓库limitations/目录下的权威限制文档为核心系统梳理 Monty 支持的语法范围、解析期拒绝的构造、缺失的内建能力、标准库子集以及若干能运行但行为与 CPython 不同的细节并结合源码与测试给出可验证的证据。读完本文你将能快速判断一段 Python 代码是否适合在 Monty 沙箱中运行也能理解 Monty 的设计哲学——记录每一种与 CPython 3.14 的已知偏差而不是悄悄静默。目录Monty 的设计哲学完备性的反面语言特性支持什么、拒绝什么标准库子集模块清单与显著缺席行为差异能运行但不完全像 CPython深入阅读与边界确认Monty 的设计哲学完备性的反面limitations/index.md开宗明义Monty 不是追求完备性的 Python 实现它实现足够让模型表达它想做的事情然后刻意止步。凡是实现的功能行为上力求与 CPython 3.14 完全一致凡是未实现或存在偏差的地方全部书面记录下来。这意味着文档本身是一种承诺机制本页limitations/index.md给出子集的整体形状limitations/目录下的其余页面如 assert.md、asyncio.md、re.md 等是逐内建、逐模块、逐构造的详尽记录它们列出每一种已知偏差包括那些显而易见的因此未在文档中出现的行为默认视为与 CPython 3.14 一致。文档明确指出这些页面是为开发者和调试在 Monty 上运行的代码的 Agent 准备的多数用户只需要这一页。官方建议优先开启类型检查而不是死记硬背本页不支持的 API 通常在运行前就会失败详见 type-checking 的 caveats 小节。语言特性支持什么、拒绝什么受支持的语法与构造根据 limitations/index.md以下语言特性在 Monty 中受支持函数定义def、async def、嵌套函数、闭包、lambda装饰器函数与类上的装饰器简单类实例方法、__init__、__repr__/__str__、__eq__/__hash__、__iter__/__next__、__contains__、__index__、类变量dataclass仅支持eq与frozen两个选项其余选项均抛NotImplementedError且没有field()、fields()、asdict()支持宿主类实例的传入传出以及被授权后沙箱可实例化的宿主类推导式list、dict、set 推导式异常处理try/except/else/finallyraise ... from ...控制流for、while、if/elif/else、break、continue、pass、assert、global、nonlocal、returnwith语句用于文件以及实现了__enter__/__exit__的类字符串格式化f-string含调试形式与str.format()支持!r/!s/!a转换、格式说明符与嵌套替换字段异步async/await以及asyncio.run/asyncio.gather导入import x、import x.y、from x import y, z as w星号解包CPython 允许的所有位置。这些语法在解析器 crates/monty/src/parse.rs 中均有对应处理分支例如Stmt::For的非异步形式被转换为Node::ForStmt::While对应Node::WhileStmt::If对应Node::If见 parse.rs 第 422-459 行。解析期直接拒绝的构造以下构造在解析阶段就抛NotImplementedError任何代码运行之前就会被拒绝类继承与元类class Foo(Bar):方法上的装饰器——因此没有classmethod、staticmethod、propertyyield/yield from——不存在生成器函数生成器表达式可以解析但当前会被物化为listmatch语句del——无论是del x还是del d[k]try*/except*异常组PEP 695type别名async with、async for与异步推导式通配符导入from m import *复数字面量1j与 t-string。源码中可以看到这些拒绝点的具体实现Stmt::Delete直接返回ParseError::not_implemented(the del statement, ...)parse.rs 第 356-359 行Stmt::TypeAlias返回ParseError::not_implemented(type aliases, ...)parse.rs 第 360 行Stmt::For的is_async分支拒绝async for loopsparse.rs 第 431-435 行AstExpr::Yield与AstExpr::YieldFrom分别拒绝yield expressions与yield from expressionsparse.rs 第 1454-1461 行。以其他方式缺失的能力用户自定义异常类内建异常类型是固定集合没有继承就无法扩展它函数属性fn.__name__、fn.__doc__等会抛AttributeError也无法设置新属性——因此functools.wraps式的元数据复制、以fn.__name__为键的注册表都没有对应物动态执行与反射eval、exec、compile、globals、locals、__import__、super全部抛NameError第三方包没有sys.path也没有 site-packages。标准库子集模块清单与显著缺席已提供的模块及偏差记录以下模块存在但每个只覆盖其 CPython 表面的一部分——往往是很小一部分模块偏差记录asyncioasyncio.mdbase64base64.mdbinasciibase64.mdcollectionscollections.mddataclassesdataclasses.mddatetimedatetime.mdfunctoolsfunctools.mditertoolsitertools.mdjsonjson.mdmathmath.mdosos.mdpathlibpathlib.mdrere.mdsyssys.mdtypingtyping.mdunicodedataunicodedata.md这些模块的实现集中在 crates/monty/src/modules/ 目录下每个模块一个文件或子目录如asyncio.rs、base64.rs、datetime.rs、re.rs、collections/、dataclasses/、json/等与文档清单一一对应。关键语义缺失的名字直接从模块命名空间中消失而不是以 stub 形式存在。因此它们不仅在运行时抛AttributeError在类型检查阶段也会失败。显著缺席的模块以下模块明确缺席enum、contextlib、random、time、io、copy、string、struct、operator、inspect、logging、traceback、hashlib、uuid、urllib。其中一部分是设计使然socket、subprocess、multiprocessing、threading、ctypes会破坏沙箱边界因此被有意排除另一部分只是尚未实现。权威清单见 modules.md。行为差异能运行但不完全像 CPython以下偏差值得提前知晓因为它们改变的是代码的行为方式而非能否运行。每个条目都链向其专属页面完整说明在那里assert失败会带 pytest 风格消息assert 2 5抛出的不是 CPython 的空AssertionError而是AssertionError: assert 2 5。可以通过checkout()的assert_message_annotationsFalse参数关闭详见 assert.md。从源码看这一特性由编译期选项 CompileOptions 控制assert_message_annotations字段默认开启操作数 repr 截断上限默认 120 字节DEFAULT_MAX_BYTES 120可通过AssertMessageAnnotations::Off或::MaxBytes(n)NonZeroU32配置from_max_bytes(n)把 0 映射为Off。选项在编译期决定是否发出内省 opcode截断上限在运行期生效。仓库测试 crates/monty/tests/assert_messages.rs 对这类消息行为有专门覆盖。enumerate、zip、map、filter、reversed是急切的这些迭代工具是**急切eager**而非惰性lazy的。因此map(f, itertools.count())会一直运行直到某个资源限制触发详见 builtins.md。re底层是 Rust 的fancy-regexMonty 的re模块由 Rust 的fancy-regex引擎支撑而非 CPython 的正则引擎不支持bytes模式、不支持VERBOSE标志部分错误消息也不同详见 re.md。源码层面crates/monty/Cargo.toml 声明了对fancy-regex的依赖crates/monty/src/modules/re.rs 与 crates/monty/src/types/re_pattern.rs、crates/monty/src/types/re_match.rs 是其实现与类型定义。类 dunder 只有文档列出的会被分发只有文档列出的类 dunder 会被分发__lt__、__len__、__getitem__、__call__以及算术 dunder 会像未定义一样抛TypeError而__bool__与__getattr__家族会被静默忽略因此实例永远为真值详见 classes.md。沙箱内没有事件循环async/await可以工作asyncio只暴露两个函数run和gather——后者并发运行宿主调用。create_task、sleep以及其余一切都不存在详见 asyncio.md。从源码看Monty 的异步模型是宿主即事件循环宿主侧函数调用返回ExternalFuture对象可被 await。async 相关类型coroutine、future、任务标识符、调用 ID集中在 crates/monty/src/asyncio.rs其模块文档明确写道The host acts as the event loop - external function calls returnExternalFutureobjects that can be awaited。模块实现位于 crates/monty/src/modules/asyncio.rs。format()内建与%格式化未实现format()内建函数和%格式化没有实现请改用str.format()或 f-string详见 format.md。只有四种编解码器只存在 UTF-8、ASCII、UTF-16、UTF-32 四种 codeclatin-1等会抛LookupError详见 encoding.md。深入阅读与边界确认对于具体功能打开本节的对应页面——页面按内建、模块或构造命名就是limitations/目录下发布的内容本身。如果遇到既不在子集中、也不在这些页面上记录的问题请在仓库中提交 issue。回顾 Monty 的限制设计可以提炼出几条实用准则先类型检查再运行官方建议开启类型检查因为不支持的 API 大多在运行前就失败把文档当作契约任何未在 limitations/ 各页面记录的偏差都默认与 CPython 3.14 一致优先使用受支持的格式化方式f-string 与str.format()而非%或format()内建警惕急切迭代与 dunder 缺失map/zip/enumerate/filter/reversed的急切性、仅部分类 dunder 被分发是行为层面最常见的意外来源不要依赖反射与动态执行eval/exec/compile/super/函数属性在 Monty 中均不可用。这份记录一切偏差的文档体系让 Agent 在沙箱中调试代码时有据可查也让 Monty 在够用与可信之间建立了清晰的边界——这正是它作为 AI 场景专用 Python 沙箱的核心价值所在。【免费下载链接】montyA minimal, secure Python interpreter written in Rust for use by AI项目地址: https://gitcode.com/GitHub_Trending/monty3/monty创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门