蟒蛇象限

quasiquotes的Python项目详细描述


docs

一些非python代码块被撒进去作为额外的调味品。

什么是quasiquote

quasiquote是一个新的语法元素,它允许我们嵌入非 Python代码到我们现有的Python代码中。基本结构如下:

# coding: quasiquotes[$name|somecodegoeshere|]

此数据将发送到:

name.quote_expr("some code goes here",frame,col_offset)

其中,frame是正在执行的堆栈帧,col_offset是列 类星体的偏移量。

这允许我们对代码使用稍微好一点的语法。 启用此扩展需要# coding: quasiquotes。 选择语法是为了匹配ghc 6.12中haskell的拟IQoote语法。我们需要 因为python的语法是 在引号打开步骤中没有它是不明确的。为了简化标记器,我们选择 使用更详细的语法。

我们也可以在modified with block:

# coding: quasiquoteswith$name:somecodegoeshere

此数据将发送到:

name.quote_stmt("    some code goes here",frame,col_offset)

cquasiqueoter

内置的cquasiqueoter允许我们将c代码内联到python中。 例如:

>>>fromquasiquotes.cimportc>>>deff(a):...with$c:...printf("%ld\n",PyLong_AsLong(a));...a=Py_None;...Py_INCREF(a);...print(a)...>>>f(0)0None>>>f(1)1None

在这里,我们可以看到类星体可以读写本地的 范围。

我们也可以用引号表达式语法引用c表达式。

>>>defcell_new(n):...return[$c|PyCell_New(n);]...>>>cell_new(1)<cellat0x7f8dde6cd5e8:intobjectat0x7f8ddf956780>

在这里我们可以看到cquasiqueoter作为一个python非常方便 接口到C API。

警告

cpython使用引用计数系统来管理对象的生命周期。 代码类似:

return[$|Py_None|]

None时可能会导致潜在的segfault,因为它将少于1 引用超出预期。相反,一定要记住增加 表达式:

return[$|Py_INCREF(Py_None);Py_None|]

从封闭的python作用域重新分配名称时,还必须递增。 有关详细信息,请参见 CPython docs

IPython集成

我们可以使用ipython repl或笔记本中的cquasiqueoter作为单元格或 线路魔术。当用作线条魔术时,它被引用为表达式。使用时 作为一个细胞魔术,它被引用为一个声明。

In[1]:importquasiquotes.cIn[2]:a=5In[3]:%cPyObject*b=PyLong_FromLong(3);PyObject*ret=PyNumber_Add(a,b);Py_DECREF(b);ret;Out[3]:8In[4]:%%c...:printf("%ld + %ld = %ld\n",3,PyLong_AsLong(a),PyLong_AsLong(_3));...:puts("reassigning 'a'");...:a=Py_None;...:Py_INCREF(a);...:3+5=8reassigning'a'In[5]:aisNoneOut[5]:True

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何从thymeleaf表单保存地址对象和用户对象的列表?   序列化java。时间使用Jackson将localdate转换为json   java删除LinearLayout和子级之间的空间   具有内存大小限制的Java队列   java尝试在freemarker中创建min(a,b)函数失败   askQuestion()方法中的Java逻辑问题   在Java客户端中接受服务器的自签名ssl证书   java如何正确更新字符串数组?   java如何使多个方法调用充当一个事务性工作单元   swing如何创建可滚动的Java框?   java如何使用SearchView在多个单词之间搜索?   初始化启动层java时出错。lang.module。FindException:模块javafx。找不到图形   java struts对隐藏字段的转义形式验证   用于构建FEM 3D解算器的java JOGL与JAVA3D   java mvn安装忽略hibernate映射文件   在C++和java之间使用JNI通信时,我在哪里保存“这个”?   java无法使用计时器重新绘制窗口   java我遇到一个找不到符号的错误,我无法解决   IntelliJIdea生成实体时java面临的问题   java在动态文本的末尾添加三个点