2011-06-07 16 views
6

Estoy haciendo una función que aceptará una cadena Unicode o un objeto bytes (o bytearray). Quiero asegurarme de que solo se pasen esos tipos. Sé que puedo verificar si algo es una cadena haciendo isinstance(x, str), y sé que puedo escribir isinstance(x, bytes) or isinstance(x, bytearray).Superclase de bytes y bytearray?

¿Hay alguna manera más concisa de verificar esto último, es decir, hay una clase de la cual derivan tanto bytes como bytearray?

+1

¿Por qué no aceptar otro tipo que soportan los requerimientos de su función, así ? ¿Por qué verificar explícitamente el tipo? –

+0

@Jim: Bueno, no sé. Estoy tratando de implementar (como ejercicio) la compresión LZW para cualquier dato binario. ¿Qué otros tipos tendría sentido aceptar? – Javier

+3

Por ejemplo matrices NumPy. O el tipo de extensión C que el usuario de su biblioteca acaba de escribir. Simplemente no sabes de qué tipo podría ser útil. Intenta trabajar con lo que obtienes: tu código fallará de todos modos si el tipo no cumple con los requisitos. –

Respuesta

6

No hay clase base común a excepción de object:

>>> bytearray.__base__ 
<class 'object'> 
>>> bytes.__base__ 
<class 'object'> 

no revise el tipo. Deja que el usuario pase parámetros de cualquier tipo que desee. Si el tipo no tiene la interfaz requerida, su código fallará de todos modos.

+1

Este es el principio [Duck Typing] (https://en.wikipedia.org/wiki/Duck_typing). –

2

que puede utilizar:

isinstance(x, (bytes, bytearray)) 

Sin embargo, duck typing podría ser útil, por lo que otros no se deriva de bytes o bytearray, pero la implementación de los métodos adecuados podrían ser pasados ​​a la función.

+0

Necesita paréntesis adicionales: 'isinstance (x, (bytes, bytearray))'. –

+0

Tienes toda la razón. – Robin

2

No tiene sentido aceptar cadenas Unicode, ya que en ningún caso son datos binarios. Probablemente aceptaría cualquier tipo de secuencia y generaría un error si algún elemento en esa secuencia no es un número entero entre 0 y 255 (que probablemente descubrirá durante la compresión).

Si quieres apoyar Python 2, también hay que aceptar cadenas como un caso especial, ya que es el tipo binario para Python 2.

+0

Entiendo que no son datos binarios, pero pensé que tenía sentido aceptar cadenas porque alguien podría querer comprimir el texto. La función busca este caso y decodifica la cadena a su representación binaria UTF-8. – Javier

+1

@Javier Badia: Si quieren comprimir el texto, deberían codificarlo primero. La compresión de texto chino codificado en UTF8 es, por ejemplo, bastante inútil, ya que UTF-16 será una codificación más eficiente. Y la compresión de texto en inglés en codificación UTF-16 sería igualmente tonto. –

+0

Supongo que tiene sentido. Gracias por la ayuda. – Javier