Je cherche des ressources qui donnent des exemples de meilleures pratiques, de modèles de conception et des principes SOLID utilisant Python.
Certains se chevauchent dans ces
Menuiserie logicielle intermédiaire et avancée en Python
Code comme un Pythonista: Python Idiomatique
Idiomes et efficacité de Python
Google Developers Day US - Python)
Une autre ressource est par exemple à Recettes Python . Un bon nombre ne suit pas les meilleures pratiques, mais vous pouvez y trouver des modèles utiles.
Type
>>> import this
dans une console Python.
Bien que cela soit généralement traité comme une (bien!) Blague, il contient quelques axiomes valides spécifiques à Python.
Le " Thinking in Python " de Bruce Eckel s'appuie fortement sur les modèles de conception
Vous pouvez commencer ici et ici .
Pour un examen plus approfondi des concepteurs, vous devez consulter Modèles de conception: éléments d'un logiciel orienté objet réutilisable . Le code source n'est pas en Python, mais il n'est pas nécessaire que vous compreniez les modèles.
Une chose que vous pouvez utiliser pour simplifier votre code lorsque vous appelez des attributs sur des objets qui pourraient ou non exister consiste à utiliser le modèle Null Object Design Pattern (auquel j'ai été introduit dans Python Cookbook ).
En gros, l’objectif avec les objets Null est de fournir un remplacement "intelligent" du type de données primitif souvent utilisé, Aucun dans Python ou Null (ou des pointeurs Null) dans d’autres langages. objectifs importants, y compris le cas important où un membre d’un groupe d’éléments par ailleurs similaires est spécial pour une raison quelconque, le plus souvent, il en résulte des instructions conditionnelles permettant de distinguer les éléments ordinaires de la valeur Null primitive.
Cet objet mange juste le manque d'erreur d'attribut, et vous pouvez éviter de vérifier leur existence.
Ce n'est rien de plus 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"
Avec cela, si vous faites Null("any", "params", "you", "want").attribute_that_doesnt_exists()
, il n'explosera pas, mais deviendra simplement l'équivalent de pass
.
Normalement, vous feriez quelque chose comme
if obj.attr:
obj.attr()
Avec cela, vous faites juste:
obj.attr()
et oublie ça. Attention, l'utilisation intensive de l'objet Null
peut potentiellement masquer des bugs dans votre code.
Vous voudrez peut-être aussi lire ceci article (sélectionnez le fichier .pdf), qui traite des modèles de conception dans des langages orientés objets dynamiques (p.ex. Python). Pour citer la page:
Cet article explore la manière dont les motifs du livre "Gang of Four" ou "GOF", comme on l'appelle souvent, apparaissent lorsque des problèmes similaires sont résolus à l'aide d'un langage de programmation dynamique, d'ordre supérieur, orienté objet. Certains modèles disparaissent - c’est-à-dire qu’ils sont directement pris en charge par les fonctionnalités du langage, que certains modèles sont plus simples ou ont un objectif différent et que d’autres sont essentiellement inchangés.