如何使用import语句覆盖python内置函数?

时间:2012-09-26 20:18:51

标签: python python-3.2

我想要记录print sys.stdout class logger: def __init__(self, filename='log.txt'): self.logf = open(filename, 'a') global print self.__print = print print = self.lognprint def __del__(self): self.logf.close() def lognprint(self, *args, **keywords): self.__print(*args, file = self.logf, **keywords) self.__print(*args, **keywords) 的文本文件。虽然我理解更聪明的人可以提出更优雅和Pythonic的解决方案,但这是我的解决方案

mylog = logger()

现在如果在我的代码中的任何地方我添加

print

之后logger编辑的任何内容也会被记录。

但是由于许多显而易见的原因,这是安全/好。例如,多个from __future__ import print_function 对象可能很讨厌。

此外,我受到

的启发
import

(例如,请参阅this)我想做类似的事情,这样当我print我的模块时,内置{{1}}被我的版本打印覆盖了码。

这怎么可能?

2 个答案:

答案 0 :(得分:1)

不要将代码放在类中,而是将其放在模块级别。这样,它将在第一次导入模块时执行:

# logging.py
print = my_print

答案 1 :(得分:1)

logging cookbook中给出了类似的解决方案,或将文件记录到文件中,该文件也打印到std.out。 以下是如何将内容简单地记录到名为“spam.log”的文件中,并将某些内容打印到std.out:

import logging

logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)
# create file handler which logs even debug messages
fh = logging.FileHandler('spam.log')
fh.setLevel(logging.DEBUG)
# create console handler with a higher log level
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
fh.setFormatter(formatter)
# add the handlers to logger
logger.addHandler(ch)
logger.addHandler(fh)

# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

在此示例中,所有消息都转到文件,只有更高级别转到控制台。