使用装饰器将所有Unicode字符串转换为二进制字符串是一个好习惯吗?

时间:2012-06-03 19:03:30

标签: python unicode decorator

最近我写了一个小脚本通过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,或者甚至可以使用其他字符串?

1 个答案:

答案 0 :(得分:6)

这是一个非常糟糕的解决方案,如果没有其他原因,它会复制codecs模块中的一个类。