Je suis agacé par l'opérateur ternaire de Python

By | août 9, 2019

Formation gratuite Python

Je ne dirais pas que CoffeeScript est foutu – c’est juste la conséquence de permettre la construction if-the-else en tant qu’expression. Scala le permet aussi comme Ruby (bien que Ruby ait aussi le test? True_v: false_v expression – mais Ruby évalue également tout comme vrai, sauf que néant et faux – y compris les collections 0, 0,0 et vides – vous voulez l'uniformité?).

Étant donné le manque de sémantique nouvelle, il est évident pour un programmeur débutant ce qui se passe, bien que cela permette la possibilité de cauchemars imbriqués si-alors- (si-alors-sinon) -else- (si-alors-sinon) . Dans le passé, un programmeur est venu me voir et m'a dit: «Je ne sais pas ce que cela veut dire!» Quand je suis confronté à l'opération ternaire de style C, mais c'était avant la diffusion généralisée d'Internet. Et certains gestionnaires que je connais se sont montrés apoplectiques face à l’utilisation de l’opération cernaire au point de l’interdire complètement dans les normes de codage – mais en général parce qu’on pouvait en abuser de la même manière qu’autre chose.

Je suppose que BDFL ne voulait pas introduire de nouveaux termes dans la syntaxe du langage – si et autre étaient déjà là, tout en évitant les écueils de test et not_always_true_value ou default_value. Vous devez également être fou pour abuser de la syntaxe, qui, bien que maladroite, supprime en quelque sorte les abus suivants, même chez les programmeurs les plus obsédés par les opérateurs.

####
depuis itertools import combinaisons_with_replacement en tant que cwr
def foo (a, b, c):
retourne (1 si b sinon 2) si a autre (3 si c sinon 4) # ugh

pour t in cwr ((False, True), 3):
affiche le format “foo : -> ” (t, foo (* t))
####

Ça marche! Mais cela introduit un certain degré d'autodiscipline. Mais vous le verriez beaucoup plus si BDFL avait permis:

#### ne fonctionnera pas
def foo (a, b, c):
retourner un? (b? 1: 2): (c? 3: 4) # Je connaissais pas mal de gens qui aimaient faire ça
####

ou même

#### ne fonctionnera pas non plus
def foo (a, b, c):
retourne si a: (si b: 1 sinon: 2) sinon: (si c: 3 sinon: 4) # détruit probablement l'analyseur !!!
####

Et c’est ce dont il parlait dans une langue qui insistait tout d’abord sur l’indentation.