我使用的是 python 2.6.6,我需要重载默认的 python 打印函数。我需要这样做,因为此代码可能在必须使用内置函数来生成输出的系统上使用,否则不会显示任何输出。
举例来说,如果你有一个像这样的 python 脚本:
from __future__ import print_function
def NewPrint(Str):
with open("somefile.txt","a") as AFile:
AFile.write(Str)
def OverloadPrint():
global print
print = NewPrint
OverloadPrint()
print("ha")
效果很好。 “重载”打印的输入位于 NewPrint 指定的文件中。
现在考虑到这一点,我希望能够运行上面的几行,并让 print 在脚本的整个执行过程中执行 NewPrint 所做的事情。现在,如果我从另一个使用 print 的模块调用一个函数,它将使用内置的 print 而不是我刚刚覆盖的那个。我猜这与命名空间和内置函数有关,但我的 python 还不够好。
Edit:
我试图保持简单,但看起来这引起了更多混乱......
- 重载 print 的函数将打印到 GUI,因此无需关心重定向IF该函数已超载。
-
我知道我的示例并没有执行打印功能实际执行的操作。一个更好的例子来说明我如何考虑编码(我知道仍然不是很好):
def hli_print(*args, **kw):
"""
print([object, ...], sep=' ', end='\n', file=sys.stdout)
"""
sep = kw.get('sep', ' ')
end = kw.get('end', '\n')
File = kw.get('file', sys.stdout)
args = [str(arg) for arg in args]
string = sep.join(args) + end
File.write(string)
hli_Print(string)
从上面的 2 中您可以看到我必须用来打印到 GUI“hli_Print”的函数,它是通过 swig 包装器公开的 C++ 函数。
- 我们只使用标准库和我们自己的 swig 包装器,我们的开发人员也使用 print 作为函数(习惯 3.X)。所以我并不太担心其他模块调用 print 并有其他东西。
从所有评论中,我猜想只使用一些 print_() 函数而不是 print() (这是我们目前所做的)可能是最好的,但我真的很好奇,看看在 python 中是否可以做我想做的事情描述。
正如 @abarnert 的回答和几条评论所指出的,替换print
可能不是一个好主意。但为了完整起见,这就是您的代码未能成功为其他模块覆盖它的原因。
The print
函数定义在模块中__builtin__ http://docs.python.org/2/library/__builtin__.html(已更名为builtins
在Python 3)。 Python解释器使一切都在__builtin__
模块的命名空间可供其运行的所有其他代码使用,而无需将其导入到模块自己的命名空间中。太神奇了!
但是,当您创建自己的名为print
(using print = NewPrint
)它不会覆盖原始版本__builtin__
。您只是在模块的名称空间中创建一个新变量,该变量会隐藏旧变量__builtin__
. The global
语句没有帮助,因为它只让你告诉Python你想要写入模块的全局命名空间,而不是函数内的某些内部命名空间。
替换默认值print
函数,您需要在__builtin__
模块。下面是一些执行此操作的示例代码:
from __future__ import print_function
try:
import __builtin__ as builtins # Python 2
except ImportError:
import builtins # Python 3
_print = print # keep a local copy of the original print
builtins.print = lambda *args, **kwargs: _print("foo:", *args, **kwargs)
再说一遍,这确实不是一个好主意。在确保我理解这个答案中所讨论的内容的同时,我设法通过替换来使我的一个 Python 会话崩溃print
使用不接受的 lambda 函数file
Python 用于打印到标准错误的参数。几行后,当异常处理程序在尝试打印另一个异常的回溯时遇到第二个异常时,它感到不高兴。
几乎肯定有更好的方法来获得您想要的结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)