关于socket执行send()语句时,例如报错TypeError: a bytes-like object is required, not ‘list’等,各种数据类型转换报错总结

关于socket执行send()语句时,各种数据形式转换报错总结

在执行connect.send()语句时,报如下类似的错
TypeError: a bytes-like object is required, not ‘str’
TypeError: a bytes-like object is required, not ‘list’
TypeError: a bytes-like object is required, not ‘set’
TypeError: a bytes-like object is required, not ‘dict’

以上问题主要是因为python3之后,无论是客户端还是服务器端的socket在执行send()或者sendall()时候,只能发送bytes类型的数据,因此需要将str,list,set,dict,object等数据类型转换成bytes类型。

代码中经常见的是TypeError: a bytes-like object is required, not ‘str’,也就是需要把字符串转换成bytes类型。因为往往socket中传递的一串数据,所以这种情况比较好解决。
对应解决方法链接如下:
链接: https://blog.csdn.net/u014770372/article/details/76285740
除了上边链接提供的decode和encode方法,也可以使用x.to_bytes来转换
下面展示例子。

    connect.send(len(x).to_bytes(length=6, byteorder='big'))

list,set,dict类型转换报错

然而在一些复杂的场景中,socket中send()的数据不是一个字符串那么简单,比如在联邦学习神经网络训练过程,client端的socket需要一次性发送profile、local gradient、epoch、labels、batch_data,intermediate data等一些列数据集合。例如下边语句:
在这里插入图片描述
这段代码中,client需要一次性发送client_fx, labels, iter, self.local_ep, self.idx, len_batch这6个数据。因此将这些数据组合作为set类型的数据data,然后 client.sendall(data)。但这时候会报错TypeError: a bytes-like object is required, not ‘set’,原因是set类型数据不不能直接发送,需要转换成bytes类型。然而如果使用to_bytes或encode方法,又会报错提示 ‘set’ object has no attribute ‘encode’,因为set,dict,list都不能直接转化成bytes类型。
有两种解决方法:
1、第一种是循环单独发送各个数据,把每个数据单独转换成bytes发送,但这种对于精确测试训练或推理延迟的场景不适用。第一种方法连接如下:
链接: https://bobbyhadz.com/blog/python-attributeerror-list-object-has-no-attribute-encode
2、第二种方法是pickle.dumps()方法。pickle.dumps()即序列化。序列化:把内存对象转换为字节序列的过程称为对象的序列化。因此我们可以通过pickle.dumps(),把set,list,dict或object转换成bytes,然后让send()法发送。因此上述图片中的代码可以改成如下:

	data={client_fx, labels, iter, self.local_ep, self.idx, len_batch}
	data=pickle.dumps(data)
	connect.send(data)

python各数据类型和pickle类总结

最后
对pyton中bytes,str,list,dict,set类型区别转换做一下总结,链接如下:https://blog.csdn.net/the_time_runner/article/details/86585766

对pickle类总结,链接如下:https://blog.csdn.net/coffee_cream/article/details/51754484

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值