Skip to main content
 首页 » 编程设计

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

2025年05月04日28xing901022

最近我写了一个小脚本来通过 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,或者甚至使用其他东西?

请您参考如下方法:

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