2010-05-11 20 views
10

Mi proyecto actual requiere un amplio uso de los campos de bits. Encontré un recipe for bit a field class simple pero funcional pero me faltaban algunas características que necesitaba, así que decidí extenderlo. Solo tengo que implementar __str__ y __repr__ y quiero asegurarme de seguir las convenciones.Python uso apropiado de __str__ y __repr__

__str__ se supone que es informal y concice, así que he hecho lo devolverá valor decimal del campo de bits (es decir str(bit field 11) habría "3".

__repr__ se supone que es una representación oficial del objeto, por lo que 've hizo volver la cadena de bits real (es decir repr(bit field 11) habría "11").

En su opinión sería esta implementación cumplir con las convenciones de str y repr?

Además, he usado la función bin() para obtener la cadena de bits del valor almacenado en la clase. Esto no es compatible con Python < 2.6, ¿hay algún método alternativo?

Saludos,

Pete

+2

Hay módulos de campo de bits disponibles, como bitstring, bitarray y bitvector (compruebe PyPi). Puede valer la pena echarles un vistazo si no quieres reinventar la rueda. –

+0

Sé que estoy reinventando la rueda aquí, pero estoy haciendo este proyecto por diversión y de alguna manera es insatisfactorio usar el código que alguien más está escrito en este contexto (¡lo sé tonto!). – Peter

Respuesta

12

El __repr__ debería ser preferiblemente una cadena que podría usarse para recrear el objeto, por ejemplo, si usa eval en él - vea los documentos here. Esta no es una ciencia exacta, ya que puede depender de cómo lo haya importado el usuario de su módulo, por ejemplo.

Tendría el __str__ devuelve la cadena binaria, y el __repr__ devuelve Classname(binary_string), o lo que sea que se podría utilizar para recrear el objeto.

En el módulo bitstring (que mantengo) el __str__ es hexadecimal si la cadena de bits es un múltiplo de 4 bits de longitud, de lo contrario es binario o una combinación de ambos. Además, si la cadena de bits es muy larga, se trunca (¡no desea intentar imprimir una cadena de bits de 100 MB en una sesión interactiva!)

Evitaría utilizar la función bin() si fuera usted. La razón es que no se puede usar si su cadena de bits comienza con cero bits (vea mi pregunta here). Aconsejo usar en su lugar un método o propiedad bin.

+4

de acuerdo.Creo que como regla eval (repr (x)) debería volver a crear x lo mejor posible. no estoy seguro acerca de str, pero me gusta esta solución. – Claudiu

1

que consideraría tener __str__ cambio una representación hexadecimal en su lugar. De esta forma, es más fácil observar cuáles son los valores de bits reales y, por lo tanto, más útiles. Pero aún bastante conciso (de hecho, menos caracteres que la representación decimal).

0

__repr__ debe devolver algo que, si se pasa a su constructor, crearía un nuevo objeto que es una copia idéntica de la original.

El suyo devuelve '11' pero si pasó '11' a su constructor no obtendría el mismo campo de bits como resultado. Entonces este __repr__ no está bien.

Cuestiones relacionadas