Python全局函数,如';打印';
我希望在Python3.3中创建一个全局函数,就像print函数一样。特别是,我们在自己的应用程序中嵌入了python,我们希望公开一个简单的“debug(value)”全局函数,可用于任何脚本。我们可以通过将函数附加到模块来实现这一点,但是,为了方便起见,它更容易像“打印(值)”一样是全局的Python全局函数,如';打印';,python,c,function,global,Python,C,Function,Global,我希望在Python3.3中创建一个全局函数,就像print函数一样。特别是,我们在自己的应用程序中嵌入了python,我们希望公开一个简单的“debug(value)”全局函数,可用于任何脚本。我们可以通过将函数附加到模块来实现这一点,但是,为了方便起见,它更容易像“打印(值)”一样是全局的 如何声明一个全局函数,使其在不导入的情况下可用于任何python文件,或者这是python中的一个黑匣子?可以从C端绑定吗?这几乎总是一个坏主意,但是如果你真的想这么做 如果您打印或以其他方式检查打印功能
如何声明一个全局函数,使其在不导入的情况下可用于任何python文件,或者这是python中的一个黑匣子?可以从C端绑定吗?这几乎总是一个坏主意,但是如果你真的想这么做 如果您打印或以其他方式检查
打印
功能,您将看到它在模块中。那是你的线索。因此,您可以这样做:
debugmodule.py:
import builtins
builtins.debug = debug
现在,在导入调试模块之后,任何其他模块都可以调用debug
,而不是debugmodule.debug
可以从C端绑定吗 在CPython中,C扩展模块基本上可以做与纯Python模块相同的事情。或者,更简单地说,用C编写一个
\u debugmodule.so
,然后编写一个debugmodule.py
,导入它并将debug
复制到内置文件中
如果要嵌入CPython,只需在启动脚本/交互式shell/任何东西之前或以后的任何时间,将函数注入内置
模块即可
虽然这确实有效,但并不完全清楚这是否真的能保证有效。如果你阅读,它会说:
作为一个实现细节,大多数模块的名称\uuuuuu内置\uuuuuu
都作为其全局模块的一部分提供。\uuuuuuuuuuuu内置项的值通常是此模块的值或此模块的\uuuuuuuu dict\uuuuuu
属性的值。由于这是一个实现细节,Python的替代实现可能不会使用它
而且,至少在CPython中,实际上是作为查找链的一部分搜索的内置模块或dict,而不是内置模块。因此,可能有另一个实现可以像CPython一样在\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
中查找东西,但同时不能在\uuuuuuuuuuuuuuuuuuuuuuuu。(因为到目前为止,CPython是唯一可用的3.x实现,所以很难推测……)
如果这在未来的Python3.x实现中不起作用,我能想到的唯一选择就是将函数注入每个模块,而不是内置模块。您可以使用导入钩子实现这一点(在3.3中,这比编写PEP 302时要容易得多……请阅读以了解详细信息)
在2.x中,没有一个模块内置
自动将东西注入神奇模块\uuuu内置
,只有一个神奇模块\uuuu内置
(注意缺少的s
)。您可能需要导入,也可能不需要导入(为了安全起见)。你可能会也可能不会改变它。但它(至少)在CPython和PyPy中起作用
那么,正确的方法是什么?简单:在所有其他模块中,只需使用debugmodule import debug
中的,而不是导入debugmodule
。这样一来,它在每个需要它的模块中都是模块级全局的。这几乎总是一个坏主意,但如果你真的想这么做
如果您打印或以其他方式检查打印
功能,您将看到它在模块中。那是你的线索。因此,您可以这样做:
debugmodule.py:
import builtins
builtins.debug = debug
现在,在导入调试模块之后,任何其他模块都可以调用debug
,而不是debugmodule.debug
可以从C端绑定吗
在CPython中,C扩展模块基本上可以做与纯Python模块相同的事情。或者,更简单地说,用C编写一个\u debugmodule.so
,然后编写一个debugmodule.py
,导入它并将debug
复制到内置文件中
如果要嵌入CPython,只需在启动脚本/交互式shell/任何东西之前或以后的任何时间,将函数注入内置
模块即可
虽然这确实有效,但并不完全清楚这是否真的能保证有效。如果你阅读,它会说:
作为一个实现细节,大多数模块的名称\uuuuuu内置\uuuuuu
都作为其全局模块的一部分提供。\uuuuuuuuuuuu内置项的值通常是此模块的值或此模块的\uuuuuuuu dict\uuuuuu
属性的值。由于这是一个实现细节,Python的替代实现可能不会使用它
而且,至少在CPython中,实际上是作为查找链的一部分搜索的内置模块或dict,而不是内置模块。因此,可能有另一个实现可以像CPython一样在\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
中查找东西,但同时不能在\uuuuuuuuuuuuuuuuuuuuuuuu。(因为到目前为止,CPython是唯一可用的3.x实现,所以很难推测……)
如果这在未来的Python3.x实现中不起作用,我能想到的唯一选择就是将函数注入每个模块,而不是内置模块。您可以使用导入钩子实现这一点(在3.3中,这比编写PEP 302时要容易得多……请阅读以了解详细信息)
在2.x中,不是一个模块内置的
,它会自动将东西注入一个神奇的模块\uu-bui