1

我的朋友正在尝试制作一个程序,他希望它能够根据 int 变量设置为0or ,在输出普通文本和使用 Rot13 编码的文本之间切换1。我们已经测试了使用"text".encode('rot13')and 可以对文本进行编码,但是必须有一种更简单的方法来使程序输出的任何内容都使用 rot13 进行编码,而不是使用if 0, output text, if 1, output rot13 text.

我希望会有某种编码,我可以将所有代码包装起来以使其工作,但我尝试在线搜索并找不到任何东西。对此的任何帮助将不胜感激。

4

3 回答 3

1

我强烈建议不要使用猴子补丁sys.stdoutsys.stderr这是一种不好的做法,因为它可能会破坏您正在使用的其他模块或使用您的代码的其他模块。

一种更安全的方法是使用logging模块的StreamHandlercodecs 模块的编码编写器一起将编码的消息打印到默认值stdoutstderr处理程序:

import logging
# import codecs # not necessary, this is embedded in logging
# import sys # not necessary, this is embedded in logging


# get your encoding flag here... 
flag = 1

# Log everything, and send it to stderr.
# create an encoded streamhandler with encoding based on flag
if flag == 1:
    writer = logging.codecs.getwriter('rot13')(logging.sys.stderr) 
    streamhandler = logging.StreamHandler(stream = writer)
else:
    streamhandler = logging.StreamHandler() # defaults to unencoded stderr
# you can use sys.stdout instead,
# it depends on preference and use case

# set the log level threshold
streamhandler.setLevel(logging.DEBUG)
# create a basic logger
log = logging.getLogger()
log.setLevel(logging.DEBUG)

log.addHandler(streamhandler)

# now, instead of print, use log.debug(message)
print 'hello world'
log.debug('hello world')

使用 logging 模块的优点是它还允许您设置自己的自定义格式化程序和过滤器,以及使用以下方式获取有意义的调试消息log.exception(...)

于 2013-02-22T19:46:19.480 回答
1

您可以像这样重定向输出:

import sys

old_stdout = sys.stdout

class MyOut(object):
    def write(self, string):
        # Do what ever you want with the string
        old_stdout.write(string.upper())

    def flush(self):
        pass

sys.stdout = MyOut()

print "Hello world!"

上面的脚本会给你HELLO WORLD!输出。

于 2013-02-22T18:49:25.670 回答
0

只需覆盖sys.stdout.

import sys

# Save the original stdout
original = sys.stdout

# Create our own stdout
class writer(object) :
    def write(self, text):
        # Do encoding here
        #text = rot13encode(text)

        original.write(text)

# Override stdout with our stdout
sys.stdout = writer()

# print as usual
print "Hello"
于 2013-02-22T18:56:11.757 回答