从如何覆盖蟒蛇建宏用import语句我得到下面的代码:
from __future__ import print_function
def print(*args, **kwargs):
.
. some intervening logic
.
return __builtins__.print(*args, **kwargs)
此代码工作正常,但模块范围。 也就是说,如果有这个文件,他们具有预期之内打印报表,经历了print()函数的定义。 然而,在导入(从富进口*)具有其导入模块内没有影响。
如果我要重写打印功能“全局”这是怎么做最好。 理想的情况是:
from MyOverrides import *
.
.
.
class foo():
.
.
def bar( self ):
print( "this is my overridden print statement" )
我缺少的未来 ,替代和打印()吗?
我的环境是2.6和前瞻性,而不是3.0。
你不能(也不应该)有一个全局覆盖,关于未来的陈述圈。 由于未来的语句影响一个Python源文件解析和编译,之前的Python甚至可以告诉的方式MyOverrides
定义打印功能,未来所有的报表模块的用途必须是明确的。 你不能从另一个模块导入未来的语句。
更换打印功能最安全的方法是明确使用from __future__ import print_function
在所有的模块,然后导入进行更换print
从你的模块中。 不要更换__builtin__.print
。
如果你想影响所有输出到标准输出,无论是打印语句或打印功能,在任何地方都,您可以替换sys.stdout
一个包装。
import sys
stdout = sys.stdout
class new_stdout(object):
def write(*args, **kwargs):
# do whatever
stdout.write(*args, **kwargs)
sys.stdout = new_stdout()
然而,这可能是一个坏主意,也不会影响使用明确的文件参数报表打印或打印功能。
另一个计算器用户提供了大部分答案,但后来显然删除了(?)。 这里是一个可行的解决方案。 我再次认识到这未必是最好的做法,但它可以在某些情况下派上用场。
模块MyOverrides.py:
from __future__ import print_function
import __builtin__
builtin_print = __builtin__.print
def print(*args, **kwargs):
.
.... whatever code you need here
.
return builtin_print(*args, **kwargs)
__builtin__.print = print
模块test.py:
from __future__ import print_function
from MyOverrides import *
.
.
.
正如其他用户所指出的, 未来的进口需求,每一个打算用未来的功能模块中发生的。
感谢谁回答,然后用户@kindall显然撤回了答案。