蟒蛇象限
quasiquotes的Python项目详细描述
一些非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