- fieldenum es un enum con valores (que se puede instanciar).
- Ofrece soporte limpio para enums con campos al estilo Rust.
- Busca equilibrar la pureza de la programación funcional con la practicidad en Python.
- Incluye por defecto
Option como alternativa a None y BoundResult como alternativa a las excepciones.
- Está completamente probado.
- La documentación en inglés todavía es limitada, pero planean seguir ampliándola gradualmente.
- Son bienvenidas todas las formas de apoyo, como issues, PRs, stars y más.
14 comentarios
Me pregunto si no sería mejor usar tipos
unioncondataclass; salvo que la declaración es más corta, no le veo muy claras las ventajas. ¿Hay algún punto en el quefieldenumsea especialmente mejor?La gran ventaja también es que la declaración es corta, concisa y solo incluye lo necesario.
Por ejemplo,
Si quisieras implementar el
fieldenumde arriba condataclass, tendrías que escribirlo así.El código se hace más largo y más difícil de leer, aumentan las posibilidades de equivocarse y tampoco da la impresión de ser un código limpio, ¿no?
Por supuesto, incluso si lo escribes así, no podrás obtener muchas de las otras funciones que ofrece fieldenum (genéricos, repr,
__fields__, ...).Por eso, tener un fieldenum que implemente y reúna todo esto resulta mucho más conveniente.
Además, también vale la pena revisar el contenido de la sección de
ejemplos.dataclassadmite una implementación dereprde forma predeterminada.dataclasses.fieldsproporciona información en tiempo de ejecución sobre la definición de los campos.typing, y el azúcar sintáctico desde 3.12.Messages, se puede implementar con un módulo.Aun así, el hecho de que no haya código boilerplate necesario para definir la clase, y que se puedan usar
enumyclasscon una sola interfaz, sí podría ser una ventaja. Gracias por la explicación detallada.https://stackoverflow.com/a/47784683
Ha habido varios intentos de expresar estructuras de esta manera, pero al final parece que puede verse como una limitación y una desventaja de Python. Conocí los ADT (algebraic data type) por primera vez en clases de la universidad con OCaml, y da un poco de lástima que en el trabajo solo se pueda imitar algo así de esta forma.
Creo que la biblioteca creada por ilotoki es probablemente el caso más cercano a un ADT. Ojalá algún día se incluya en la biblioteca estándar y llegue a usarse ampliamente.
Si la implementación de
Messagese hiciera con unUnion, no se podría aprovechar la herencia de métodos. Por ejemplo,Si se agrega un método
.processcomo arriba, se puede usar el método.process()en todas las variantes.Además, el
reprque expliqué se refiere al "reprcomo variante de ese enum".Por ejemplo, si se llama a
reprenvolviendofieldenum, se ejecuta así.Si no hay un
__repr__personalizado, no se expresa el hecho de que sea una subvariante del enumMessage.Quites una variante unitaria y se usa sin llamarla.Además, en el caso de las variantes sin campos que sí requieren llamada, se pueden comprobar como singleton con el operador
is.Usar
fieldenumayuda a encargarse automáticamente de varios detalles de implementación que son fáciles de pasar por alto.Quisiera sugerirles si podrían dar una charla en PyCon Korea. Me pareció interesantísimo y me gustaría escuchar directamente la historia y la explicación del proceso de creación.
Sería realmente un honor poder presentarlo en PyCon. No sé si será algo que pueda lograr solo porque yo quiera hacerlo(^^;), pero lo voy a pensar.
Y también estaría bien que en el README en inglés se explicara el ejemplo de
Option.Optiones fácil de entender y permite un acercamiento más familiar. Incluso podría ser mejor explicar primeroOptionen el orden de la documentación.La documentación en inglés todavía no está lista, así que está un poco incompleta... Planeo traducirla al inglés cuando la documentación en coreano esté lo suficientemente madura. ¡O también son bienvenidos los PR relacionados!
A mí también me parece mejor presentar primero
Option. Lo corregiré.Oh, oh. ¡Qué curioso!
Hay una corrección en el código de ejemplo de la documentación en coreano del enlace que compartiste.
¡Gracias por avisar! ¡Ya lo corregí!
Debí publicarlo con Show GN, pero por error lo publiqué como uno normal;;
Ya fue corregido.
¡Gracias~