1

最近、telnet 経由でサーバーに接続するための小さなスクリプトを書きました (何らかの理由で、すべての特定のプログラムが接続を拒否しました)。プログラムは次のとおりでした。

import telnetlib
tn = telnetlib.Telnet('www.google.com',80)
tn.write('GET / HTTP/1.0\n')
tn.write('Host: www.google.com\n')
tn.write('User-agent: Chrome\n\n')
out = tn.read_all()
print(out)

Python 2.x では問題なく動作しました。しかし、その後 Python 3.x で使い始めたところ、Python 3.x 以降のすべての文字列が Unicode オブジェクトであるという問題に遭遇しました。そこで、どうすれば修正できるかを考え始め、デコレータを使用して解決策を見つけました。

実際にはb、すべての文字列の前に置くこともできました (文字列はごくわずかでした)。しかし、私はそれが巨大なコード スニペットであるかのようにやりたかったのです (トレーニングと優れたコード プラクティスを使用するためだけに)。

デコレータを使用したソリューションは次のとおりです。

def to_binary(f):
    def wrapper(self, *args):
        s,*args = args
        s = s.encode() #this line performs conversion to binary string
        return f(self, s, *args)
    return wrapper

telnetlib.Telnet.write = to_binary(telnetlib.Telnet.write)

私の質問は:

これは、将来私がプロジェクトで使用するのに適したソリューションですか? または、すべての文字列の先頭に を追加tn.writeするbか、他のものを使用することをお勧めします。

4

1 に答える 1

6

codecsモジュール内のクラスの1つが行うことを複製する以外の理由がなければ、それはひどい解決策です。

于 2012-06-03T19:04:53.833 に答える