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