如果您检查了有关通过C调用运行python代码的Python C- API documentation,您将总会提及SELECT /* several columns */
FROM X JOIN Y ON X.A = Y.A
WHERE COL1 = 'a'
AND COL2 IS NULL
AND (CASE
WHEN 'G' = P_SP_PARAM AND
NOT EXISTS (SELECT 1
FROM Z
WHERE Z.A = X.A)
THEN 1
WHEN 'H' = P_SP_PARAM
THEN 0
ELSE 0
END) = 1
,但除文档的最后一部分和对其可能的值及其对执行的影响一无所知。
答案 0 :(得分:2)
PyCompilerFlags
是C API,等效于传递给compile
的 flags 参数以及Python中的相关函数。如果您在查看CPython C-API文档之前还不了解Python文档,这可能一点都不明显。
来自compile
:
可选参数 flags 和 dont_inherit 控制哪个future statements影响源代码的编译。如果两者都不存在(或两者都不为零),则使用在调用
compile()
的代码中有效的将来的语句来编译代码。如果给出了 flags 参数而 dont_inherit 不为(或为零),则除了 flags 参数外,还将使用由 flags 参数指定的将来语句。那些无论如何都会被使用。如果 dont_inherit 是一个非零整数,则使用 flags 参数-忽略围绕编译调用生效的未来语句。将来的语句由位指定,这些位可以按位“或”在一起以指定多个语句。在
__future__
模块的compiler_flag
实例上的_Feature
属性中可以找到指定给定功能所需的位域。
在指向future statements的链接之后,提供了有关其工作方式的更多详细信息,并且到__future__
的链接具有一个图表,显示了将来可用的语句列表。
另一件事可能并不明显:每个将来的功能标志都对应一个标志,该标志以co_flags
对象的code
属性结尾。所以:
code = compile('1 <> 2', '', 'eval', flags=__future__.barry_as_FLUFL.compiler_flag)
assert code.co_flags & CO_FUTURE_BARRY_AS_BDFL
在C语言中,如果您通过struct PyCompilerFlags flags = { CO_FUTURE_BARRY_AS_BDFL }
可获得相同的效果。
如果要查看这些标志的实际数值,则必须在C源代码或CO_*
源代码中查找相应的__future__
常量。
在某些方面,C API的情况略有不同。
PyRun_*
或PyCompile_*
通话期间生效。PyCompile_Flags
结构,该结构包含一个int而不是原始int。这只是出于类型检查的目的;在内存中,包含int的结构的存储方式与int相同。让我们看一个完整的例子。即使我一直链接到3.7个文档,我也会使用Python 2.7,因为使用print
的示例比使用前向注释的示例更简单。
此代码显示一个空的元组:
print()
但是,如果您使用PyRun_SimpleStringFlags
运行第一个,并将CO_FUTURE_PRINT_FUNCTION
(0x10000)作为 flags `传递,它将打印空白行,例如Python 3。
如果运行此代码:
from __future__ import print_function
print()
…,那么无论您传递的是0
还是CO_FUTURE_PRINT_FUNCTION
,它都会打印空白行。通话结束后,如果您查看通过引用传递的 flags ,它将带有CO_FUTURE_PRINT_FUNCTION
或已添加到其上。因此,如果您一次要编译并运行一个块,则可以将相同的值传递给下一个字符串,它将继承该将来的标志。 (就像当您在交互式解释器中编写将来的语句时,它会影响您之后解释的所有语句。)