Si j'ai une fonction comme celle-ci:
def foo(name, opts={}):
pass
Et je veux ajouter des indicateurs de type aux paramètres, comment puis-je le 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 jette pas une erreur de syntaxe mais cela ne semble pas être le moyen intuitif de gérer ce cas:
def foo(name: str, opts: dict={}) -> str:
pass
Je ne trouve rien dans la typing
documentation ou dans une recherche Google.
Edit: Je ne savais pas comment les arguments par défaut fonctionnaient dans Python, mais dans l’intérêt de 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
Votre deuxième voie est correcte.
def foo(opts: dict = {}):
pass
print(foo.__annotations__)
cette sortie
{'opts': <class 'dict'>}
Il est vrai que cela ne figure pas dans la liste PEP 484 , mais les indications de type sont une application des annotations de fonctions documentées dans le document PEP 3107. La section sur la syntaxe indique clairement que les arguments de mots clés fonctionne 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 .
Si vous utilisez en tapant (introduit dans Python 3.5), vous pouvez utiliser typing.Optional
, où Optional[X]
équivaut à Union[X, None]
. Il est utilisé pour signaler que la valeur explicite de None
est autorisée. De en tapant.Optional :
def foo(arg: Optional[int] = None) -> None:
...
J'ai récemment vu ce one-liner:
def foo(name: str, opts: dict=None) -> str:
opts = {} if not opts else opts
pass