- fieldenum é um enum que possui valores (e pode ser instanciado).
- Oferece suporte elegante a enums com campos no estilo Rust.
- Busca equilibrar a pureza da programação funcional com a praticidade em Python.
- Por padrão, oferece suporte a
Option como alternativa a None e a BoundResult como alternativa a exceções.
- Totalmente testado.
- A documentação em inglês ainda é limitada, mas há planos de melhorá-la gradualmente.
- Todo tipo de apoio é bem-vindo, como issues, PRs, stars e outras formas de contribuição.
14 comentários
Eu também fico pensando se não seria melhor usar um tipo union com
dataclass; tirando o fato de a declaração ser mais curta, não vejo muito bem quais seriam as vantagens. Ofieldenumteria algum ponto em que ele é especialmente melhor?A declaração ser curta e concisa, contendo apenas o que é necessário, também é uma grande vantagem.
Por exemplo,
Para implementar o
fieldenumacima comdataclass, seria preciso escrever algo assim.O código fica mais longo, mais difícil de ler, a chance de cometer erros aumenta, e não dá exatamente a sensação de um código limpo, não é?
Claro, mesmo escrevendo dessa forma, você ainda não terá acesso a vários outros recursos oferecidos pelo
fieldenum(genéricos, repr,__fields__, ...).Por isso, ter um
fieldenumque já implementa e reúne tudo isso é muito mais conveniente.Além disso, também vale a pena dar uma olhada no conteúdo da seção de
exemplos.dataclassoferece implementação dereprpor padrãodataclasses.fieldsfornece informações em tempo de execução sobre a definição dos campostyping, e o açúcar sintático desde a 3.12Messages, isso pode ser implementado com um móduloMesmo assim, a ausência de código boilerplate necessário para definir classes e a possibilidade de usar
enumeclasscom uma única interface certamente podem ser vantagens. Obrigado pela explicação detalhada.https://stackoverflow.com/a/47784683
Já houve várias tentativas de representar structs desse jeito, mas no fim acho que isso pode ser visto como um limite e uma desvantagem do Python. Tive meu primeiro contato com ADT (algebraic data type) nas aulas da faculdade, com OCaml, e é meio triste que no trabalho a gente tenha que apenas imitar isso dessa forma.
A biblioteca criada pelo ilotoki provavelmente é o caso que mais se aproxima de um ADT. Seria ótimo se algum dia ela fosse incluída na biblioteca padrão e passasse a ser amplamente usada.
Se a implementação de
Messagefosse feita comUnion, não seria possível aproveitar herança de métodos. Por exemplo,Ao adicionar o método
.processcomo acima, é possível usar o método.process()em todas as variantes.Além disso, o
reprque mencionei significa o "repr como variante desse enum".Por exemplo, ao chamar
reprcom fieldenum envolvendo a chamada, ele é executado da seguinte forma.Sem um
__repr__personalizado, o fato de ele ser uma subvariante do enumMessagenão é representado.Quité uma variante unitária e é usada sem chamada.Além disso, no caso das variantes sem campos que exigem chamada, elas podem ser verificadas como singleton com o operador
is.Usar fieldenum ajuda a cuidar automaticamente desses vários detalhes de implementação que são fáceis de deixar passar.
Queria sugerir, por acaso, que você apresentasse isso na PyCon Korea. Achei muito divertido de ver e gostaria de ouvir diretamente de você as histórias e explicações do processo de criação!
Seria realmente uma honra poder apresentar isso na PyCon. Não sei se só por eu querer isso significa que vou conseguir (^^;), mas vou pensar a respeito.
E também seria bom se o README em inglês explicasse um exemplo de
Option.Optioné fácil de entender e permite uma abordagem mais familiar. Talvez também fosse melhor explicarOptionprimeiro na ordem das explicações da documentação.A documentação em inglês ainda não está pronta, então está um pouco incompleta... Quando a documentação em coreano estiver suficientemente madura, pretendo traduzi-la para o inglês. Ou PRs relacionados também são bem-vindos!
Também acho que apresentar
Optionprimeiro parece melhor. Vou corrigir isso.Ooh. Que interessante!!
Há uma correção no código de exemplo da documentação em coreano do link que você enviou.
Obrigado por avisar. Corrigi!
Era para eu ter postado no Show GN, mas por engano publiquei como post normal;;
Corrigi isso.
Obrigado~