2013-04-02 65 views
0

我正在寻找在python 3.3中像打印函数一样的全局函数。特别是我们在我们自己的应用程序中嵌入了python,我们希望公开一个简单的“调试(值)”全局函数,可用于任何脚本。我们可以通过将函数附加到模块来完成此操作,但是,为了方便起见,它更容易成为像'print(value)'这样的全局函数。Python全局函数像'print'

如何声明一个全局函数,该函数可用于任何没有导入的python文件,或者这是python中的黑盒子?是否有可能从C端绑定?

+2

正在使模块的这部分不适合您的情况? – summea

+0

看到这个问题 http://stackoverflow.com/questions/4698493/can-i-add-custom-methods-attributes-to-built-in-python-types – wallacer

+0

@Stephane出于某种原因,我从来没有发现在我的搜索中,我一直在谷歌搜索了一个多小时的关于Python中的'全局函数'。谢谢 – Trevor

回答

4

这几乎总是一个坏主意,但如果你真的想这样做......

如果你打印出来或以其他方式检查print功能,你会看到它的模块builtins英寸这是你的线索。所以,你可以这样做:

debugmodule.py:

import builtins 
builtins.debug = debug 

现在,一个import debugmodule后,任何其他模块可以叫debug而不是debugmodule.debug


是否有可能从C端绑定呢?

在CPython中,C扩展模块基本上可以完成与纯Python模块相同的功能。或者,更简单地说,在C中输入_debugmodule.so,然后输入debugmodule.py,并将debug复制到builtins中。

如果要嵌入CPython,只需在启动脚本/交互式shell /任何内容之前将此函数注入builtins模块中,或者稍后再执行此操作。


虽然这肯定工程,它不是完全清楚这是否是真正保证工作。如果你读the docs,它说:

作为一个实现细节,大多数模块的名称为__builtins__作为其全局的一部分提供。 __builtins__的值通常是此模块或此模块的__dict__属性的值。由于这是一个实现细节,它可能不会被替代的Python实现使用。

而且,至少在CPython的,它实际上是那个被搜索的查找链,而不是builtins模块的一部分__builtins__模块或字典。因此,另一个实现可能会像CPython那样在__builtins__中查找事物,但同时不会使builtins(或用户对其进行修改)在__builtins__中自动可用,在这种情况下,这将不起作用。 (由于CPython是迄今为止唯一可用的3.x实现,所以很难推测......)

如果这对某些未来的Python 3.x实现不起作用,我唯一能想到的选择就是让你的函数注入每个模块,而不是内置。你可以用一个PEP-302导入钩子(这在3.3中比在PEP 302写入时容易得多...详细请参阅The import system)。


,而不是一个模块builtins自动注入东西放进魔术模块__builtins__在2.x中,但只是一个神奇的模块__builtin__(注意失踪s)。你可能也可能不需要import它(所以你也可以安全)。你可能会也可能不会改变它。但它在(至少)CPython和PyPy中起作用。


那么,什么是正确的方式做到这一点?简单:而不是import debugmodule,只需from debugmodule import debug在你所有的其他模块。这样它最终成为每个需要它的模块中的模块级全局。

+0

非常好,它的工作原理。 – Trevor