『科技排头』在Rust代码中编写Python是种怎样的体验?
文章图片
文章图片
作者|MaraBos , Rust资深工程师
译者|Arvin , 编辑|屠敏
来源|CSDN(ID:CSDNnews)
大约一年前 , 我发布了一个名为inline-python(https://crates.io/crates/inline-python)的Rust类库 , 它允许大家使用python!{..}宏轻松地将一些Python混合到Rust代码中 。 在本系列中 , 我将从头展示开发此类库的过程 。
文章图片
预览
如果不熟悉inline-python类库 , 你可以执行以下操作:
fnmain{letwho=''world'';letn=5;python!{foriinrange('n):print(i,''Hello'','who)print(''Goodbye'')}}它允许你将Python代码直接嵌入Rust代码行之间 , 甚至直接在Python代码中使用Rust变量 。
我们将从一个比这个简单得多的案例开始 , 然后逐步努力以达到这个结果(甚至更多!) 。
文章图片
运行Python代码
首先 , 让我们看一下如何在Rust中运行Python代码 。 让我们尝试使第一个简单的示例生效:
fnmain{println!(''Hello...'');run_python(''print(''...World!'')'');}我们可以使用std::process::命令来运行python可执行文件并传递python代码 , 从而实现run_python , 但如果我们希望能够定义和读回Python变量 , 那么最好从使用PyO3库开始 。
PyO3为我们提供了Python的Rust绑定 。 它很好地包装了PythonCAPI , 使我们可以直接在Rust中与各种Python对象交互 。 (甚至在Rust中编写Python库 , 但这是另一个主题 。 )
它的Python::run功能完全符合我们的需求 。 它将Python代码作为&str , 并允许我们使用两个可选的PyDicts来定义范围内的任何变量 。 让我们试一试吧:
fnrun_python(code:&str){letpy=pyo3::Python::acquire_gil;//Acquirethe'globalinterpreterlock',asPythonisnotthread-safe.py.python.run(code,None,None).unwrap;//Nolocals,noglobals.}$cargorunCompilingscratchpadv0.1.0Finisheddev[unoptimized+debuginfo]target(s)in0.29sRunning`target/debug/scratchpad`Hello......World!看 , 这就成功了!
文章图片
基于规则的宏
在字符串中编写Python不是最便捷的方法 , 所以我们尝试改进它 。 宏允许我们在Rust中自定义语法 , 所以让我们尝试一下:
fnmain{println!(''Hello...'');python!{print(''...World!'')}}宏通常是使用macro_rules!进行定义 , 您可以基于标记和表达式之类的内容使用高级“查找和替换”规则来定义宏 。 (有关macro_rules!的介绍请参见RustBook中有关宏的章节 , 有关Rust宏所有的细节都可以在《Rust宏的小书》中找到 。 )
由macro_rules!定义的宏在编译时无法执行任何代码 , 这些宏仅是应用了基于模式的替换规则 。 它非常适合vec! , 甚至是lazy_static!{..} , 但对于解析和编译正则表达式(例如regex!(''a.*b''))之类的功能而言 , 还不够强大 。
在宏的匹配规则中 , 我们可以匹配表达式 , 标识符 , 类型和许多其他内容 。 由于“有效的Python代码”不是一个选项 , 所以我们只能让宏接受所有内容:大量的原始的符号:
macro_rules!python{($($code:tt)*)=>{...}}(有关macro_rules!工作原理的详细信息 , 请参见上面链接的资源 。 )
对宏的调用应该产生run_python(''..'') , 这是一个包裹了所有Python代码的字符串文本 。 幸运的是:有一个内建宏为我们把内容放到一个字符串里 , 叫做stringify! , 因此我不必从头开始 。
- 盘点科技SE上手,体验能否依旧精彩?,“狂降400元”的新款iPhone
- 科技圈测评哥罗永浩直播间的一幕,揭露与雷军真实关系!网友看后:喊话董明珠
- 王石头科技阿里和华为终有一场较量!AI芯片自研实力,究竟谁更胜一筹?
- 乐居网姑苏区新增四个科技创新重点项目!,刚刚
- 快科技这就是丰巢收费的理由:扛不住了,4年亏了20亿
- 推哥科技爆料支持120hz屏,安卓优势不再!,iPhone12曝三大优势
- SENSORO升哲科技需要物联网技术来寻找新的增长点,后疫情时代下的零售业
- 天天科技范Plus正式发布,iQOO将全球首发,天玑1000
- 数码科技大爆炸前魅族高管李楠再放狠话!华为旗舰机瀑布屏设计没用:只是炒作概念
- 快科技Air装上Windows后:屏幕亮度暴增30%,给全新MacBook