Add fluent interface pattern as teaching example
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 48/100
- Tipo de issue
- Documentación
- Claridad
- Bastante claro
- Estado de actividad
- Estancado
- Stack tecnológico
- python
- Área
- documentation
Línea de trabajo
No se nombra ningún archivo de destino ni ejercicio existente. Empieza por localizar la sección del curso donde se enseñan ejemplos de diseño de API o de plotting y, después, revisa su formato y las lecciones adyacentes. Se considera terminado cuando se añada una sección didáctica o un ejercicio que presente los patrones enumerados y las compensaciones entre su descubribilidad, seguridad de tipos, componibilidad, compatibilidad y curva de aprendizaje.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Add a section or exercise covering API design patterns for simplifying functions with many parameters.
Good reference example: https://github.com/DHI/modelskill/discussions/492 — the scatter() function has grown a long signature:
def scatter(
x: np.ndarray,
y: np.ndarray,
*,
bins: int | float = 120,
quantiles: int | Sequence[float] | None = None,
fit_to_quantiles: bool = False,
show_points: bool | int | float | None = None,
show_hist: Optional[bool] = None,
show_density: Optional[bool] = None,
norm: Optional[colors.Normalize] = None,
backend: Literal["matplotlib", "plotly"] = "matplotlib",
figsize: Tuple[float, float] = (8, 8),
xlim: Optional[Tuple[float, float]] = None,
ylim: Optional[Tuple[float, float]] = None,
reg_method: str | bool = "ols",
title: str = "",
xlabel: str = "",
ylabel: str = "",
skill_table: Optional[str | Sequence[str] | Mapping[str, str] | bool] = False,
skill_scores: Mapping[str, float] | None = None,
skill_score_unit: Optional[str] = "",
ax: Optional[Axes] = None,
**kwargs,
) -> Axes:
Alternative patterns to simplify
1. Fluent interface (method chaining)
Each component gets its own method. Easy to add/remove parts.
(Comparer(x, y)
.plot()
.scatter(alpha=0.5)
.qq([0.05, 0.5, 0.75, 0.95])
# .reg_line(equation=True)
.skill_table(("n", "bias"))
).show()
2. Configuration objects (dataclasses)
Group related parameters into typed config objects.
@dataclass
class ScatterStyle:
bins: int = 120
show_points: bool = True
show_density: bool = False
norm: colors.Normalize | None = None
@dataclass
class Layout:
figsize: tuple[float, float] = (8, 8)
xlim: tuple[float, float] | None = None
ylim: tuple[float, float] | None = None
title: str = ""
xlabel: str = ""
ylabel: str = ""
scatter(x, y, style=ScatterStyle(bins=50), layout=Layout(title="My plot"))
3. Presets / named styles
Offer common configurations as named presets, with overrides.
scatter(x, y, preset="minimal") # just points + 1:1 line
scatter(x, y, preset="full") # density + qq + regression + skill table
scatter(x, y, preset="presentation") # large fonts, clean layout
scatter(x, y, preset="minimal", title="Hm0") # preset + override
4. Composition of small functions
Instead of one function that does everything, provide building blocks that work with a standard Axes.
fig, ax = plt.subplots()
plot_scatter(ax, x, y, show_density=True)
plot_qq(ax, x, y, quantiles=[0.25, 0.5, 0.75])
plot_reg_line(ax, x, y)
add_skill_table(ax, x, y, metrics=["bias", "rmse"])
Each pattern has trade-offs worth discussing: discoverability, type safety, composability, backwards compatibility, learning curve.
Relevant topics: method chaining, Self return type, builder pattern, dataclasses as config, API design trade-offs.
- Lenguaje dominante
- Jupyter Notebook
- Estrellas
- 8
- Forks
- 1
- Merge medio
- 4 min
- PR fusionados (30 d)
- 1
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de DHI/python-package-development
-
Dificultad 2/5 1-2 días Aptitud para principiantes 88/100
-
Dificultad 2/5 1-2 días Aptitud para principiantes 72/100
DHI/python-package-development#37 · 1 comentario ·
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 48/100
-
Dificultad 3/5 1-2 días Aptitud para principiantes 48/100
Todos los issues de DHI/python-package-development
Issues similares
-
Area: Excel support
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
orbeon/orbeon-forms#7893 ·
-
Theme loads third-party resources on every page (jsdelivr web font, cdnjs Font Awesome) – GDPR Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
docToolchain/docToolchain#1705 ·
-
kb-infra-drift
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
OCHA-DAP/ds-knowledge-base#653 · 1 comentario ·
-
area/dev-productivity area/disaster-recovery area/ipcei kind/enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
-
Claiming namespace: rasy007 Abiertonamespace operations
Dificultad 1/5 Menos de una hora Aptitud para principiantes 90/100
EclipseFdn/open-vsx.org#13419 ·