Quelle est la syntaxe préférée pour initialiser un dict: accolades littéraux {} ou la fonction dict ()?

Je fais des efforts pour apprendre Python et je suis très attentif aux normes de codage communes. Cela peut sembler une question pointilleuse mais j’essaie de me concentrer sur les meilleures pratiques au fur et à mesure de mon apprentissage, je n’ai donc pas à désapprendre les mauvaises habitudes.

Je vois deux méthodes courantes pour initialiser un dict:

a = { 'a': 'value', 'another': 'value', } b = dict( a='value', another='value', ) 

Qui est considéré comme “plus pythonique”? Lequel utilisez-vous? Pourquoi?

Accolades. Passer des arguments de mot-clé dans dict() , bien que cela fonctionne à merveille dans de nombreux scénarios, ne peut initialiser une carte que si les clés sont des identifiants Python valides.

En d’autres termes, il ne peut pas faire:

 a = {'import': 'trade', 1: 7.8} 

Le premier, les accolades. Sinon, vous rencontrez des problèmes de cohérence avec les clés comportant des caractères impairs, tels que = .

 # Works fine. a = { 'a': 'value', 'b=c': 'value', } # Eeep! Breaks if trying to be consistent. b = dict( a='value', b=c='value', ) 

La première version est préférable:

  • Cela fonctionne pour tous les types de clés, vous pouvez par exemple dire {1: 'one', 2: 'two'} . La deuxième variante ne fonctionne que pour certaines clés de chaîne. L’utilisation de différents types de syntaxe en fonction du type de clé serait une incohérence inutile.
  • C’est plus rapide:

     $ python -m timeit "dict(a='value', another='value')" 1000000 loops, best of 3: 0.79 usec per loop $ python -m timeit "{'a': 'value','another': 'value'}" 1000000 loops, best of 3: 0.305 usec per loop 
  • Si la syntaxe spéciale pour les littéraux de dictionnaire n’était pas destinée à être utilisée, elle n’existerait probablement pas.

Je pense que la première option est préférable car vous allez accéder aux valeurs sous la forme d’un [‘a’] ou d’un [‘autre’]. Les clés de votre dictionnaire sont des chaînes et il n’y a aucune raison de prétendre qu’elles ne le sont pas. Pour moi, la syntaxe du mot-clé semble astucieuse au premier abord, mais rest obscure à un second regard. Cela n’a de sens que si vous travaillez avec __dict__ , et les mots-clés vont devenir des atsortingbuts plus tard, quelque chose comme ça.

FYI, au cas où vous auriez besoin d’append des atsortingbuts à votre dictionnaire (éléments qui sont attachés au dictionnaire, mais qui ne font pas partie des clés), vous aurez alors besoin du deuxième formulaire. Dans ce cas, vous pouvez initialiser votre dictionnaire avec des clés comportant des caractères arbitraires, un par un, comme ceci:

  class mydict(dict): pass a = mydict() a["b=c"] = 'value' a.test = False 

Parfois, dict() est un bon choix:

 a=dict(zip(['Mon','Tue','Wed','Thu','Fri'], [x for x in range(1, 6)])) mydict=dict(zip(['mon','tue','wed','thu','fri','sat','sun'], 

[random.randint (0,100) pour x dans la plage (0,7)]))

J’utilise presque toujours des accolades; cependant, dans certains cas où j’écris des tests, je fais de la compression / décompression des mots clés et dans ces cas, dict () est beaucoup plus facile à maintenir, car je n’ai pas besoin de changer:

 a=1, b=2, 

à:

 'a': 1, 'b': 2, 

Cela aide également dans certaines circonstances où je pense que je pourrais vouloir le transformer ultérieurement en une instance nommée ou un nom de classe.

Dans l’implémentation elle-même, à cause de mon obsession de l’optimisation, et quand je ne vois pas un avantage de maintenabilité particulièrement important, je privilégierai toujours les accolades.

Dans les tests et l’implémentation, je n’utiliserais jamais dict () s’il y a une chance que les clés ajoutées alors ou ultérieurement:

  • Pas toujours une chaîne
  • Non seulement contiennent des chiffres, des lettres ASCII et des traits de soulignement
  • Commencez avec un entier ( dict(1foo=2) déclenche une erreur de syntaxe)