Codewars 刷题笔记(Python)2.Binary Addition

题目

Implement a function that adds two numbers together and returns their sum in binary. The conversion can be done before, or after the addition.
The binary number returned should be a string.

难度:7 kyu

我的解法

def add_binary(a,b):
    return bin(a + b)[2:]

思路很简单:

  1. 将a和b的和用bin()函数转为以字符串表示的二进制字面量(示例:bin(2)结果为'0b10'
  2. 因为输出结果要求去掉字符串开头的'0b',所以我们对上一步的结果字符串做一下切片,获取字符串子串。

其他解法

def add_binary(a,b):
    return '{0:b}'.format(a + b)

或者

def add_binary(a,b):
    return '{:b}'.format(a + b)

这个解法我是真没想到过,看了别人的解答才稍微有点理解,因为这个涉及到Python的内建函数format,详细可以参考PyFormat'{:b}'可以简单认为是十进制转二进制的转换器(b意思是binary),我只做个简单的了解。
在这里插入图片描述

学习总结

  1. bin()函数我是现学现搜的,非常简单。
  2. 调试时错了一次,根据输出对比发现题目要求去掉字符串开头的'0b',所以做了下切片处理。
  3. 虽然简单,但是我的解法和最佳答案是一样的,还是很高兴的。
  4. 看到其他解法时也感觉自己要学的东西还有很多,不懂的太多了。
<think>好的,我现在要解决用户遇到的TypeError问,错误信息是“psycopg2.extensions.Binary object does not support indexing”。首先,我需要弄清楚这个错误发生的原因。用户在使用psycopg2库的Binary对象时,试图对其进行索引操作,导致Python抛出不支持索引的错误。 可能的情况是用户在处理二进制数据,比如将图片或文件存入PostgreSQL数据库时,使用了psycopg2Binary来包装数据。例如,用户可能尝试像这样插入数据:cursor.execute("INSERT INTO table (data) VALUES (%s)", (psycopg2.Binary(binary_data),))。然而,如果在后续操作中,用户错误地将这个Binary对象当作字节流来处理,并尝试通过索引访问其中的字节,比如binary_obj[0],就会触发这个错误,因为Binary对象本身并不支持索引操作。 接下来,我需要验证这个猜测是否正确。查阅psycopg2的文档,发现Binary对象确实是将Python的二进制类型(如bytes或bytearray)适配到PostgreSQL的bytea类型。它的主要作用是在传递数据时进行正确的编码,而不是提供一个可索引的缓冲区。因此,当用户尝试索引Binary实例时,Python会抛出TypeError,因为该对象没有实现__getitem__方法。 解决方案应该是让用户在需要访问二进制数据时,先将其转换为bytes或bytearray类型。例如,如果从数据库中读取了Binary对象,应该使用bytes()函数进行转换,然后再进行索引或其他操作。另外,检查用户代码中是否有地方错误地处理了Binary对象,确保在插入时使用Binary包装,而在读取后正确转换。 还需要考虑用户是否在数据存储和读取的过程中存在其他操作,比如序列化或反序列化,是否在某个步骤中意外保留了Binary对象而没有转换回来。此外,可能还需要提醒用户关于PostgreSQL中bytea类型的处理方式,以及psycopg2自动转换的机制,避免不必要的包装和解包步骤。 最后,总结解决方案:避免直接对Binary对象进行索引,使用正确的类型转换,并在数据库操作中正确使用Binary包装输入数据。同时,提供示例代码说明如何正确插入和读取二进制数据,帮助用户理解和修改他们的代码。</think>### 解决方案:`psycopg2.extensions.Binary` 对象不支持索引的 TypeError 错误 #### 错误原因分析 该错误发生在尝试对 `psycopg2.extensions.Binary` 对象进行索引操作时。此对象用于将二进制数据(如 `bytes` 或 `bytearray`)适配到 PostgreSQL 的 `bytea` 类型,但它本身不直接支持类似字节流的索引访问[^1]。例如以下代码会触发错误: ```python binary_obj = psycopg2.Binary(b'data') print(binary_obj[0]) # TypeError ``` --- #### 解决方法分步说明 ##### 1. **插入数据时:保持 Binary 包装** 确保插入二进制数据时正确使用 `Binary`,但不要直接操作该对象: ```python # 正确用法:直接作为参数传递 with psycopg2.connect(...) as conn: cursor = conn.cursor() binary_data = b'\x01\x02\x03' cursor.execute("INSERT INTO table (blob_column) VALUES (%s)", (psycopg2.Binary(binary_data),)) # 包装后直接传递 ``` ##### 2. **读取数据时:转换为 bytes/bytearray** 从数据库读取二进制数据后,需显式转换为可索引的类型: ```python cursor.execute("SELECT blob_column FROM table") result = cursor.fetchone() # 转换为 bytes 类型 byte_data = bytes(result[0]) # 或 bytearray(result[0]) print(byte_data[0]) # 正常访问 ``` ##### 3. **避免直接操作 Binary 对象** 若需处理二进制内容,应在转换后再操作: ```python # 错误示例(直接索引): binary_wrapper = psycopg2.Binary(b'123') # print(binary_wrapper[0]) # 会报错 # 正确示例(先转换): raw_data = bytes(binary_wrapper) print(raw_data[0]) # 输出: 49 (ASCII '1') ``` --- #### 代码对比示例 **错误代码**: ```python data = psycopg2.Binary(b'\x48\x65\x6c\x6c\x6f') first_byte = data[0] # 触发 TypeError ``` **修正代码**: ```python data = psycopg2.Binary(b'\x48\x65\x6c\x6c\x6f') raw_bytes = bytes(data) first_byte = raw_bytes[0] # 正确获取第一个字节 (0x48) ``` --- #### 注意事项 1. **自动类型转换**:psycopg2 默认会将 `bytea` 列返回为 `memoryview` 对象(Python 3),可直接索引或转换为 `bytes` 2. **参数适配**:仅需在插入/更新时使用 `Binary` 包装二进制数据,读取时无需额外处理 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值