Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python全局函数,如';打印';_Python_C_Function_Global - Fatal编程技术网

Python全局函数,如';打印';

Python全局函数,如';打印';,python,c,function,global,Python,C,Function,Global,我希望在Python3.3中创建一个全局函数,就像print函数一样。特别是,我们在自己的应用程序中嵌入了python,我们希望公开一个简单的“debug(value)”全局函数,可用于任何脚本。我们可以通过将函数附加到模块来实现这一点,但是,为了方便起见,它更容易像“打印(值)”一样是全局的 如何声明一个全局函数,使其在不导入的情况下可用于任何python文件,或者这是python中的一个黑匣子?可以从C端绑定吗?这几乎总是一个坏主意,但是如果你真的想这么做 如果您打印或以其他方式检查打印功能

我希望在Python3.3中创建一个全局函数,就像print函数一样。特别是,我们在自己的应用程序中嵌入了python,我们希望公开一个简单的“debug(value)”全局函数,可用于任何脚本。我们可以通过将函数附加到模块来实现这一点,但是,为了方便起见,它更容易像“打印(值)”一样是全局的


如何声明一个全局函数,使其在不导入的情况下可用于任何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