Estoy buscando recursos que den ejemplos de mejores prácticas, patrones de diseño y principios SÓLIDOS usando Python.
Estoy buscando recursos que den ejemplos de mejores prácticas, patrones de diseño y principios SÓLIDOS usando Python.
Respuestas:
Alguna superposición en estos
Carpintería de software intermedia y avanzada en Python
Código como un pitonista: pitón idiomático
Modismos y eficiencia de Python
Google Developers Day US - Patrones de diseño de Python
Otro recurso es, por ejemplo, en Python Recipes . Un buen número no sigue las mejores prácticas, pero puede encontrar algunos patrones que son útiles.
" Thinking in Python " de Bruce Eckel se apoya fuertemente en patrones de diseño
Para una mirada más profunda a los patrones de diseño, debe mirar Patrones de diseño: elementos de software orientado a objetos reutilizables . El código fuente no está en Python, pero no es necesario que comprenda los patrones.
Algo que puede usar para simplificar su código al invocar atributos en objetos que pueden o no existir es usar el Patrón de diseño de objetos nulos (al que me introduje en Python Cookbook ).
Aproximadamente, el objetivo con los objetos nulos es proporcionar un reemplazo 'inteligente' para el tipo de datos primitivos frecuentemente utilizado Ninguno en Python o Nulo (o punteros nulos) en otros idiomas. Estos se utilizan para muchos propósitos, incluido el caso importante en el que un miembro de algún grupo de elementos similares es especial por cualquier razón. Muy a menudo, esto da como resultado declaraciones condicionales para distinguir entre elementos ordinarios y el valor nulo primitivo.
Este objeto solo come la falta de error de atributo y puede evitar verificar su existencia.
No es nada más que
class Null(object):
def __init__(self, *args, **kwargs):
"Ignore parameters."
return None
def __call__(self, *args, **kwargs):
"Ignore method calls."
return self
def __getattr__(self, mname):
"Ignore attribute requests."
return self
def __setattr__(self, name, value):
"Ignore attribute setting."
return self
def __delattr__(self, name):
"Ignore deleting attributes."
return self
def __repr__(self):
"Return a string representation."
return "<Null>"
def __str__(self):
"Convert to a string and return it."
return "Null"
Con esto, si lo haces Null("any", "params", "you", "want").attribute_that_doesnt_exists()
, no explotará, sino que en silencio se convertirá en el equivalente de pass
.
Normalmente harías algo como
if obj.attr:
obj.attr()
Con esto, solo haces:
obj.attr()
y olvídalo. Tenga en cuenta que el uso extensivo del Null
objeto puede ocultar errores en su código.
También puede leer este artículo (seleccione el archivo .pdf), que analiza los patrones de diseño en lenguajes dinámicos orientados a objetos (es decir, Python). Para citar la página:
Este artículo explora cómo los patrones del libro "Gang of Four", o "GOF", como se le llama a menudo, aparecen cuando se abordan problemas similares utilizando un lenguaje de programación dinámico, de orden superior y orientado a objetos. Algunos de los patrones desaparecen, es decir, son compatibles directamente con las características del lenguaje, algunos patrones son más simples o tienen un enfoque diferente, y algunos permanecen esencialmente sin cambios.