3 ms·
Let us know how we can improve! Feel free to start a discussion (https://github.com/TimefoldAI/timefold-solver/discussions https://github.com/TimefoldAI/timefol
by cchianel 2y ago
Let us know how we can improve! Feel free to start a discussion (https://github.com/TimefoldAI/timefold-solver/discussions https://github.com/TimefoldAI/timefold-solver/discussions) or submit an issue (https://github.com/TimefoldAI/timefold-solver-python/issues https://github.com/TimefoldAI/timefold-solver-python/issues).
We aim to treat Python as a first-class citizen (while keeping it maintainable). For instance, many of the Java methods are mapped to properties on the Python classes with more Pythonic names (see `ScoreExplanation` for an example).
I suspect what gives the Java smell is probably the `SolverFactory`/`SolverConfig`, which is a lot of boilerplate code. A lot of the code can be generated, although we would need to design an API for that.
The fluent (method chaining) API might also be giving the Java smell; I don't see many fluent API being used in Python. In particular, needing to either end lines with `\` or surround the statement with brackets make long fluent chains annoying to use. This is harder to change, since there is no Pythonic alternative that I know of for method chaining.
- dcsan 2y agoLangchain did something overloading the | or operator in their LCEL DSL to form LLM pipelines. It feels like abusing python but it's familiar enough as a Unix syntax
- cchianel 2y agoDoes constraint_factory.create_from_chain( ForEach(Shift) | Filter(lambda shift: shift.required_skill not in shift.employee.skills) | Penalize(HardSoftScore.ONE_HARD) | AsConstraint("Missing required skill") ) Feel more Pythonic than ( constraint_factory.for_each(Shift) .filter(lambda shift: shift.required_skill not in shift.employee.skills) .penalize(HardSoftScore.ONE_HARD) .as_constraint("Missing required skill") ) ?