Argparse - groupes exlusifs et options parentes

Bon, je continue ma découverte de python, notamment, en fouinant par là:

Au sujet des groupes exclusifs (je prend un exemple):

ecran = parser.add_mutually_exclusive_group()
ecran.add_argument ("-ecr", help="écran classique", action="store_true")
ecran.add_argument ("-lcd", help="écran LCD 2x16" , action="store_true")

c’est pratique à un détail près, pour lequel je n’ai pas trouvé d’info:
ne serait-il pas possible de désigner un paramètre par défaut en cas d’incohérence dans un groupe d’options incompatibles?

Autre exemple:

parser.add_argument("-Cu"    , help=hlp_Cu     , action="store_true")
parser.add_argument("-Cu_NF" , help=hlp_Cu_NF  , action="store_true")
parser.add_argument("-Cu_a1" , help=hlp_Cu_a1  , action="store_true")
parser.add_argument("-Cu_b1" , help=hlp_Cu_b1  , action="store_true")

Actuellement, je gère ça dans la suite du programme, mais l’option « cuivre » -Cu est parente des options « nuances de cuivre » ( -Cu_NF -Cu_a1 -Cu_b1). En cas d’incohérence sur les options « enfants », au travers des méthodes incluse dans la librairie « arparse », est-il possible de donner une instruction au programme pour qu’il exécute l’option « parente » ou là, le programme vas demander « ok, c’est du cuivre mais lequel? »
Désolé, sur ce 2e exemple, je suis pas sur d’être très clair…

hello,

si j’ai bien compris le module argparse se contente de parser la ligne de commande… et de contrôler la cohérence des paramètres.
en clair le premier cas empêche la saisie de paramètres incompatibles mais la logique c’est que suivant le paramètre sélectionner on va obligatoirement le tester et en fonction du choix, déterminer un traitement ( donc c’est lors du test qu’on choisira une option par défaut ou d’arrêter le traitement )
l’autre possibilité étant qu’en l’absence d’argument -lcd on traite les ecr …

parser.add_argument("-lcd", help="écran LCD 2x16" , action="store_true")

sinon j’ai trouvé ça :

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import argparse

def do_stdout():
    # do everything that is required to support stdout
    print("stdout!")
    return
def do_csv():
    # do everything that is required to support CSV file
    print("csv!")
    return
def do_text():
    # do everything that is required to support TXT file
    print("text!")
    return

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('-s', '--stdout', action='store_const', dest='type', const=do_stdout)
group.add_argument('-c', '--csv', action='store_const', dest='type', const=do_csv)
group.add_argument('-t', '--txt', action='store_const', dest='type', const=do_text)
parser.set_defaults(type=do_stdout)
# pour forcer l’exécution en cas d'erreur
# pas recommandé mais ça marche !
try :
   args = parser.parse_args()
   args.type()
except:
   print ("erreur ! stdout forcé par défaut")
   do_stdout()

pourquoi faire simple quand on peut faire compliqué :wink:
source : Python argparse - Mutually exclusive group with default if no argument is given - Stack Overflow

pour le deuxième cas si tu supprimes la première ligne tu n’as plus le choix qu’entre les options utiles ( d’où l’importance de la clarté de ce qui sort en « help »)

Au contraire, la première ligne a son utilité:
Si tu choisis l’option « -Cu » le programme te donne quelques indices pour choisir la nuance à utiliser.

pour le moment, j’utilise cette solution:

# vérif cohérence cuivre
Cu_x= args.Cu_NF + args.Cu_a1+ args.Cu_b1
# correction si incohérence cuivre
if Cu_x>1: 
    args.Cu_NF= args.Cu_a1= args.Cu_b1=0
    args.Cu   =1

Je pensais que c’était pas très élégant, mais ça me semble plus simple que ton contre-exemple…