ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Pyrlang数据类型终极对照表:atom、pid、improper list、bitstring跨语言转换全解析

Pyrlang数据类型终极对照表:atom、pid、improper list、bitstring跨语言转换全解析 Pyrlang数据类型终极对照表atom、pid、improper list、bitstring跨语言转换全解析【免费下载链接】PyrlangErlang node implemented in Python 3.5 (Asyncio-based)项目地址: https://gitcode.com/gh_mirrors/py/PyrlangPyrlang 是一个用 Python 3基于 Asyncio实现的 Erlang 节点能让你的 Python 程序像 Erlang、Elixir 节点一样加入 BEAM 集群。而两者互通时最容易踩坑的正是数据类型atom、pid、improper list、bitstring这些类型在 Python 与 Erlang 之间并不一一对应。本文给出一张跨语言转换终极对照表把解码Erlang→Python和编码Python→Erlang两种方向一次讲清帮你在几分钟内看懂每个类型到底变成了什么。先认识 PyrlangPython 如何成为 Erlang 节点Pyrlang 是即插即用的 Erlang 节点实现几行启动代码即可让 Python 进程成为集群中的一个节点支持 Erlang 19~25 的分发协议。它的定位可以概括为 收发本地 / 远程消息按pid或注册名 在 Python 与 Erlang 之间互相link/monitor 支持 Erlang 的rpc:call反向调用 Python 提供GenServer风格的 Python 进程理解这些能力的前提是先搞懂数据类型如何在两种语言间映射——这正是本文的主题。更多功能说明见 README.md完整文档源文件在 data_types.rst。一张表看懂 Erlang → Python 解码对照当消息从 Erlang 流进 Python时Pyrlang 会按下表自动解码Erlang 类型Python 类型说明atom()Pyrlang.Atom可用str()或直接取text_属性integer()int支持任意大小整数float()float64 位双精度浮点list()list直接映射为 Python 列表improper_list()(list, 尾元素)解码为列表 尾巴元组unicodestring()list(int)本质是整数列表bytestring()bytes字节串tuple()tuple直接映射map()dict直接映射binary()bytes直接映射bitstring()(bytes, int)元组字节串 末字节位数pid()Pyrlang.Pid进程标识reference()Pyrlang.Reference引用fun()Pyrlang.Fun在 Python 中基本无用 注意Pid、Reference、Fun、Atom、ImproperList、Bitstring这些特殊类型来自配套的term库Pyrlang 直接使用它们来表示 Erlang 特有值。一张表看懂 Python → Erlang 编码对照反过来从 Python 发往 Erlang时Pyrlang 按下表编码。这里的关键区别是improper list和bitstring需要显式包装才能正确发回 Erlang。Python 类型Erlang 类型说明Pyrlang.Atomatom()需包装为 Atomintinteger()floatfloat()listlist()Pyrlang.ImproperListimproper_list()⚠️ 必须显式包装list(int)string()整数列表会被当作字符串bytesbinary()tupletuple()dictmap()Pyrlang.Bitstringbitstring()⚠️ 末字节不完整Pyrlang.Pidpid()Pyrlang.Referencereference()Pyrlang.Funfun()基本无用其它对象#{ClassName, #{}}部分类型可能编码失败atom最容易被忽略的类型陷阱atom是最常见的消息载荷但它在 Python 里不是普通字符串而是Pyrlang.Atom对象。接收时拿到的是Atom想取文本可用str(atom)或atom.text_发送时普通字符串不会自动变成 atom需要from term import Atom后写成Atom(hello)as_str()工具函数可统一处理 bytes / str / Atom 到字符串的转换位于 util.py。发送示例见 e01_simple_node.py那里就是用一个Atom(hello)把消息发给 Erlang shell。pid进程标识的跨语言映射pid是 Erlang 进程的身份证。在 Pyrlang 中接收解码为Pyrlang.Pid对象可直接打印、比较发送把Pyrlang.Pid原样传回 Erlang 即可本地创建可用node.register_new_process()造一个假 pid用于向远程进程发消息进程与节点的通信入口在 node.py 与 process.py。当你做link/monitor时收到的监控消息形如{DOWN, Ref, process, Pid, Reason}——里面的Pid与Ref都是对应的 Erlang 类型对象。improper listErlang 列表的隐形尾巴这是新手最容易困惑的地方。Erlang 列表分两类普通列表最后一个单元格的尾巴是[]NIL直接映射为 Pythonlist非规范列表improper list尾巴不是[]而是某个值Pyrlang 的解码规则收到普通列表→ Pythonlist收到improper list→ 解码成元组(list, 尾元素)想发回improper list → 必须用Pyrlang.ImproperList包装换句话说如果你只看到(list, tail)元组而少了一层多半是 Erlang 那边发来的是 improper list。bitstring位字符串的 (bytes, int) 解码binary二进制和bitstring位串是两回事binary()→ 解码为 Pythonbytesbitstring()→ 解码为元组(bytes, last_byte_bits)第二个 int 表示最后一个不完整的字节占了几位要把 bitstring 发回 Erlang需用Pyrlang.Bitstring类包装。 实用建议文档特别指出为减少混淆建议始终用 UTF-8 的 binary 发送字符串而不是依赖整数列表。字符串与二进制Erlang 的字符串其实是列表这是跨语言转换里最大的认知陷阱Erlang 里写hello只是语法糖本质是一个值小于 256 的整数列表Python 的默认str是unicode 对象与列表处理方式完全不同如果 Erlang 侧发来的字符串只含字节0~255节点会优化成字节数组发出你在 Python 端收到的是bytes和发 binary 一样普通整数列表与字符串之间很难一眼区分只能检查元素范围来猜所以判断逻辑很简单收到bytes就很明确收到list则要考虑它可能是字符串。实战在 Pyrlang 中安全收发数据把上面的规则落到日常开发记住这三步收消息先判型用isinstance判断是Atom、Pid还是普通list/tuple再决定如何取值发特殊类型先包装improper list用ImproperList、bitstring用Bitstring其余尽量用原生int/float/str/bytes/list/dict模式匹配交给框架Pyrlang 的receive支持仿 Erlang 的条款匹配匹配逻辑见 match.py从 Erlang 反向调用可参考 Erlang 侧的 py.erl 辅助模块配合 cooking 文档 里的 notebook 风格调用你能把先在 Python 算、再回传结果的流程跑通。常见报错与排查清单遇到类型不对时按此清单快速定位 收到bytes却以为是字符串 → Erlang 侧发的其实是字节串 收到(list, tail)元组 → 这是improper list 收到(bytes, int)元组 → 这是bitstringint是末字节位数atom无法和字符串直接比较 → 用str(atom)或atom.text_转成文本 发送improper list到 Erlang 变成普通列表 → 忘了用ImproperList包装小结把这张对照表刻进脑子里Pyrlang 让 Python 无缝接入 BEAM 集群而数据类型的正确映射是稳定互通的地基。核心记忆点只有四句普通类型int / float / list / tuple / dict / bytes直接映射几乎无脑atom / pid / reference是 Erlang 专属对象收发都按对象处理improper list解码为(list, tail)发送需ImproperListbitstring解码为(bytes, int)发送需Bitstring对照 data_types.rst 的两张原始表你现在已经能独立读懂任意一条跨语言消息的真实形态了。【免费下载链接】PyrlangErlang node implemented in Python 3.5 (Asyncio-based)项目地址: https://gitcode.com/gh_mirrors/py/Pyrlang创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表