Si j'ai une fonction comme celle-ci:
def foo(name, opts={}):
pass
Et je veux ajouter des indices de type aux paramètres, comment faire? La façon dont j'ai supposé me donne une erreur de syntaxe:
def foo(name: str, opts={}: dict) -> str:
pass
Ce qui suit ne génère pas d'erreur de syntaxe, mais cela ne semble pas être la manière intuitive de gérer ce cas:
def foo(name: str, opts: dict={}) -> str:
pass
Je ne trouve rien dans la typing
documentation ou sur une recherche Google.
Edit: je ne savais pas comment les arguments par défaut fonctionnaient en Python, mais pour cette question, je garderai les exemples ci-dessus. En général, il est préférable de procéder comme suit:
def foo(name: str, opts: dict=None) -> str:
if not opts:
opts={}
pass
scala
langue le fait aussi.Réponses:
Votre deuxième voie est correcte.
cela produit
Il est vrai que ce n'est pas répertorié dans PEP 484 , mais les indications de type sont une application des annotations de fonction, qui sont documentées dans PEP 3107. La section de syntaxe indique clairement que les arguments de mots clés fonctionnent avec les annotations de fonction de cette manière.
Je déconseille fortement d'utiliser des arguments de mots clés mutables. Plus d'informations ici .
la source
Si vous utilisez la saisie (introduite dans Python 3.5), vous pouvez utiliser
typing.Optional
, oùOptional[X]
est équivalent àUnion[X, None]
. Il est utilisé pour signaler que la valeur explicite deNone
est autorisée. À partir de la frappe .la source
=
inOptional[int] = None
comme c'est la convention pour les arguments de mot-clé sans indication de type?J'ai récemment vu ce one-liner:
la source
None
la valeur par défaut, puis la vérification à l'intérieur de la méthode évite ce problème en allouant un nouveau dict à chaque fois que la méthode est invoquée.