El objeto ‘largo’ de Python no tiene el atributo ‘to_bytes’?

Estoy tratando de usar un validador de direcciones bitcoin escrito en Python desde aquí :

Este fragmento me da problemas, sin embargo:

def decode_base58(bc, length): n = 0 for char in bc: n = n * 58 + digits58.index(char) return n.to_bytes(length, 'big') 

Entiendo que n es un int o un largo, pero ninguno tiene un método llamado to_bytes, por lo que realmente no entiendo cómo podría haber funcionado este código.

¿Alguien sabe lo que está mal aquí? ¿Estoy haciendo algo mal o este código simplemente está mal escrito? Todos los consejos son bienvenidos!

Python 2.7 int y long no tienen el método .to_bytes . Python 3.2 int tiene el método .to_bytes .

Una solución para Python 2.x:

 >>> length = 10 >>> n = 123456789 >>> ('%%0%dx' % (length << 1) % n).decode('hex')[-length:] '\x00\x00\x00\x00\x00\x00\x07[\xcd\x15' 

Como Python 3.2, los tipos de enteros incorporados proporcionan un método to_bytes . https://docs.python.org/3/library/stdtypes.html#int.to_bytes

El código que has enlazado contiene:

 assert n.to_bytes(length, 'big') == bytes( (n >> i*8) & 0xff for i in reversed(range(length))) 

lo que significa que puede definir una función to_bytes :

 def to_bytes(n, length): return bytes( (n >> i*8) & 0xff for i in reversed(range(length))) 

Y úsalo como tal:

 def decode_base58(bc, length): n = 0 for char in bc: n = n * 58 + digits58.index(char) return to_bytes(n, length)