TypeError: el objeto ‘int’ no es un subíndice

¿Por qué este fragmento de código da como resultado que: TypeError 'int' object is not subscriptable ?

 return (bin(int(hexdata)[2:].zfill(16))) 

hexdata es una cadena hexadecimal. Por ejemplo, puede ser 0x0101 .

Estas haciendo esto

 >>> int('1234')[2:] Traceback (most recent call last): File "", line 1, in  TypeError: 'int' object has no attribute '__getitem__' >>> 1234[2:] Traceback (most recent call last): File "", line 1, in  TypeError: 'int' object has no attribute '__getitem__' 

Si pretendía eliminar los dos primeros caracteres, utilice lo siguiente:

 >>> int('1234'[2:]) 34 

Si la cadena original es una representación hexadecimal, debe pasar el argumento base opcional 16

 >>> int('1234'[2:], 16) 52 

Si [2:] se usa para eliminar 0b generado por bin (no para eliminar los caracteres iniciales de la cadena original), lo siguiente es lo que desea.

 >>> int('0x1234', 16) # No need to remove leading `0x` 4660 >>> int('0x1234', 0) # automatically recognize the number's base using the prefix 4660 >>> int('1234', 16) 4660 >>> bin(int('1234', 16)) '0b1001000110100' >>> bin(int('1234', 16))[2:] '1001000110100' >>> bin(int('1234', 16))[2:].zfill(16) '0001001000110100' 

Por cierto, puedes usar str.format o format lugar de bin + str.zfill :

 >>> '{:016b}'.format(int('1234', 16)) '0001001000110100' >>> format(int('1234', 16), '016b') '0001001000110100' 

ACTUALIZAR

Si especifica 0 como base, int reconocerá automáticamente la base del número usando el prefijo.

 >>> int('0x10', 0) 16 >>> int('10', 0) 10 >>> int('010', 0) 8 >>> int('0b10', 0) 2 

Paréntesis en el lugar equivocado. Suponiendo que tiene una cadena como “0x0101” donde quiere terminar con una cadena binaria de 16 dígitos:

 bin(int(hexdata,16))[2:].zfill(16) 

La llamada int(X,16) interpreta eso como un número hexadecimal (y puede aceptar un número de la forma 0xSomething ). Entonces bin(X) convierte eso en una cadena de la forma 0b01010101 .

El [2:] luego se deshace del 0b en el frente y zfill(16) llena hasta 16 “bits”.

 >>> bin(int("0x0102",16))[2:].zfill(16) '0000000100000010'