C'est vrai, la plupart des langages de programmation de faire de l'ordre des paramètres une partie du contrat d'appel de la fonction, mais cela n'a pas d'effet sur la qualité de l'appel de fonction. besoin de l'être. Pourquoi en serait-il ainsi ? Ma question est donc de savoir si Python est différent des autres langages de programmation à cet égard. En plus d'autres bonnes réponses pour Python 2, veuillez considérer ce qui suit :
__named_only_start = object()
def info(param1,param2,param3,_p=__named_only_start,spacing=10,collapse=1):
if _p is not __named_only_start:
raise TypeError("info() takes at most 3 positional arguments")
return str(param1+param2+param3) +"-"+ str(spacing) +"-"+ str(collapse)
La seule façon pour un appelant de fournir des arguments spacing
y collapse
positionnellement (sans exception) serait :
info(arg1, arg2, arg3, module.__named_only_start, 11, 2)
La convention de ne pas utiliser d'éléments privés appartenant à d'autres modules est déjà très basique en Python. Comme pour Python lui-même, cette convention pour les paramètres ne serait que partiellement appliquée.
Dans le cas contraire, les appels devraient être de la forme :
info(arg1, arg2, arg3, spacing=11, collapse=2)
Un appel
info(arg1, arg2, arg3, 11, 2)
attribuerait la valeur 11 au paramètre _p
et une exception soulevée par la première instruction de la fonction.
Caractéristiques :
- Paramètres avant
_p=__named_only_start
sont admis de manière positionnelle (ou nominative).
- Paramètres après
_p=__named_only_start
doit être fourni par son nom uniquement (à moins que la connaissance de l'objet sentinelle spécial __named_only_start
est obtenu et utilisé).
Pour :
- Les paramètres sont explicites en termes de nombre et de signification (ces derniers si de bons noms sont également choisis, bien entendu).
- Si la sentinelle est spécifiée comme premier paramètre, tous les arguments doivent être spécifiés par leur nom.
- Lors de l'appel de la fonction, il est possible de passer en mode positionnel en utilisant l'objet sentinelle
__named_only_start
dans la position correspondante.
- On peut s'attendre à de meilleures performances que les autres solutions.
Cons :
La vérification a lieu au moment de l'exécution et non de la compilation.
- Utilisation d'un paramètre supplémentaire (mais pas d'un argument) et d'une vérification supplémentaire. Légère dégradation des performances par rapport aux fonctions normales.
- La fonctionnalité est un piratage sans support direct de la langue (voir note ci-dessous).
- Lors de l'appel de la fonction, il est possible de passer en mode positionnel en utilisant l'objet sentinelle
__named_only_start
dans la bonne position. Oui, cela peut aussi être considéré comme un avantage.
N'oubliez pas que cette réponse n'est valable que pour Python 2. Python 3 met en œuvre le mécanisme similaire, mais très élégant, supporté par le langage, décrit dans d'autres réponses.
J'ai découvert que lorsque j'ouvre mon esprit et que j'y réfléchis, aucune question ou décision d'autrui ne me semble stupide, idiote ou simplement idiote. Bien au contraire : j'apprends généralement beaucoup.