1

0私の友人はプログラムを作成しようとしていますが、int変数がまたはに設定されているかどうかに基づいて、通常のテキストの出力とRot13でエンコードされたテキストの出力を切り替えることができるようにしたいと考えています1。を使用してテストしまし"text".encode('rot13')たが、これはテキストをエンコードするために機能しますが、テキスト出力のすべてのインスタンスを。でラップするよりも、プログラム出力をrot13でエンコードする簡単な方法が必要if 0, output text, if 1, output rot13 textです。

すべてのコードをラップして機能させることができる何らかのエンコーディングがあることを期待していましたが、オンラインで検索しようとしましたが、何も見つかりませんでした。これでどんな助けでも大いに感謝されるでしょう。

4

3 に答える 3

1

モンキーパッチsys.stdoutsys.stderr.

より安全な方法は、ロギングモジュールのStreamHandlercodecs モジュールのエンコードされたライターと組み合わせて使用​​し、エンコードされたメッセージをデフォルトstdoutまたはstderrハンドラーに出力することです。

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 に答える