web-dev-qa-db-fra.com

Ajout de la valeur de paramètre par défaut avec l'indicateur de type dans Python

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
139
josh

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 .

170

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:
    ...
3
Tomasz Bartkowiak

J'ai récemment vu ce one-liner:

def foo(name: str, opts: dict=None) -> str:
    opts = {} if not opts else opts
    pass
1
Kirkalicious