gpt4 book ai didi

python - 如何从 C 扩展模块中的 __future__ 导入

转载 作者:太空宇宙 更新时间:2023-11-04 00:59:54 24 4
gpt4 key购买 nike

我有一个扩展模块需要支持 Python 2 和 Python 3。当它加载时,我想做一些类似 from __future__ import print_function 的事情,这样如果有人试图这样做:

PyRun_SimpleString("print 'foo'");

它会失败,但如果他们这样做:

PyRun_SimpleString("print('foo', file=sys.stdout)");

它会成功的。我已经尝试了很多东西,包括来自 future 语句的 PyRun_SimpleString。像这样:

PyRun_SimpleString("from __future__ import print_function");

我也试过像这样调用 PyImport_ImportModuleEx:

PyImport_ImportModuleEx("__future__", nullptr, nullptr, fromlist);

其中 fromlist 是一个 PyObject 表示列表 ["print_function"]

这些都不起作用。有可能使这项工作吗?

最佳答案

PyRun_SimpleString 没有任何地方可以指定编译器标志,但是有一个 whole host of related functions有更多的选择。例如,PyRun_SimpleStringFlags 执行 PyRun_SimpleString 的操作,但使用 flags 参数来指定编译器标志。使用PyRun_SimpleStringFlags 执行的__future__ 语句可以修改flags,并且使用相同flags 的其他调用将看到更改>.

您可以使用 future 语句或 C 级标志定义来初始化 flags。大多数可能的标志未在 C-api 文档中列出(因为 C-api 文档有点烂),但您可以在 __future__ 模块或 Python 的几个部分中找到它们源代码。

>>> import __future__
>>> for name in dir(__future__):
... if name.startswith('CO_'):
... print name
...
CO_FUTURE_ABSOLUTE_IMPORT
CO_FUTURE_DIVISION
CO_FUTURE_PRINT_FUNCTION
CO_FUTURE_UNICODE_LITERALS
CO_FUTURE_WITH_STATEMENT
CO_GENERATOR_ALLOWED
CO_NESTED

例如,您可以在 from __future__ import print_function with

的作用下运行一个字符串
PyCompilerFlags flags = {CO_FUTURE_PRINT_FUNCTION};
PyRun_SimpleStringFlags(command, &flags);

如果您想保存用户执行的 future 语句的效果,您可以将 PyCompilerFlags 结构保存在某处,并对所有调用使用相同的结构。


话虽如此,我不认为自动应用 from __future__ import print_function 是正确的做法。人们会惊讶地期待他们所使用的任何解释器的默认行为。此外,PyRun_InteractiveOneFlags 可能有助于让用户输入多行 Python 语句。

关于python - 如何从 C 扩展模块中的 __future__ 导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33311945/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com