从How to override python builtins with an import statement我获得了以下代码:
from __future__ import print_function
def print(*args, **kwargs):
.
. some intervening logic
.
return __builtins__.print(*args, **kwargs)
此代码工作正常,但具有模块范围。也就是说,如果此文件中有print语句,则它们按预期工作,通过定义的print()函数。但是,导入它(来自foo import *)在导入它的模块中没有任何效果。
如果我想要“全局”覆盖打印功能,那么最好如何做到这一点。理想的情况是:
from MyOverrides import *
.
.
.
class foo():
.
.
def bar( self ):
print( "this is my overridden print statement" )
我在这里错过了什么未来,覆盖和打印()?
我的环境是2.6并且前进,但不是3.0。
答案 0 :(得分:1)
您不能(也不应该)拥有打开未来声明的全局覆盖。由于未来的语句会影响Python源文件的解析和编译方式,因此在Python甚至可以告诉MyOverrides
定义打印函数之前,模块使用的所有未来语句都必须是显式的。您无法从其他模块导入future语句。
替换打印功能的最安全方法是在所有模块中明确使用from __future__ import print_function
,然后从其中一个模块导入print
的替换。请勿替换__builtin__.print
。
如果要在stdout中输出所有输出,无论是通过print语句还是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()
但是,这可能是一个坏主意,它不会影响使用显式文件参数的print语句或打印函数。
答案 1 :(得分:1)
另一个stackoverflow用户提供了大部分答案,但后来显然删除了它(?)。这是一个有效的解决方案。我再一次认识到这不一定是最佳实践,但在某些情况下它可以很方便。
模块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回答,然后显然撤回了答案。