0

How to override python builtins with a import statement我获得了以下代码:

from __future__ import print_function
def print(*args, **kwargs):
    .
    . some intervening logic
    .
    return __builtins__.print(*args, **kwargs)

此代码工作正常,但具有模块范围。也就是说,如果此文件中有打印语句,它们按预期工作,通过定义的 print() 函数。但是,导入它(从 foo import *)在导入它的模块中没有任何影响。

如果我想“全局”覆盖打印功能,最好如何完成。理想情况下:

from MyOverrides import *
.
.
.
class foo():
    .
    .
    def bar( self ):
        print( "this is my overridden print statement" )

我在这里错过了future、 overrides 和 print() 什么?

我的环境是 2.6 及更高版本,但不是 3.0。

4

2 回答 2

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 回答,然后显然撤回了答案。

于 2013-07-11T19:37:24.617 回答
1

您不能(也不应该)拥有一个打开未来语句的全局覆盖。由于未来语句会影响 Python 源文件的解析和编译方式,因此在 Python 甚至可以判断MyOverrides定义打印函数之前,模块使用的所有未来语句都必须是显式的。您不能从另一个模块导入未来语句。

替换打印功能的最安全方法是在所有模块中显式使用,然后从其中一个from __future__ import print_function模块导入替换。print不要更换__builtin__.print

如果你想影响到标准输出的所有输出,无论是通过 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()

但是,这可能是个坏主意,它不会影响使用显式文件参数的打印语句或打印函数。

于 2013-07-11T19:04:57.700 回答