Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

argparse : fonction default evaluée à chaque fois

+3 votes
#!/usr/bin/env python3.4
import sys
import argparse


def ask(question, default=None):
    if sys.stdout.isatty():
        return input(question)

    return default


class TestApp(object):
    def __init__(self):
        parser = argparse.ArgumentParser()

        parser.add_argument(
            "base",
            help="base a optimiser",
            nargs='?',
            default=ask("base:"))

        parser.parse_args()

if __name__ == "__main__":
    TestApp()

Dans cet exemple ask() est executée à chaque fois, meme si j'ai precisé l'argument base.
Y-a t-il moyen de modifier ce comportement ?

demandé 24-Fev-2015 par juke (318 points)

Si la réponses est bonne, clique sur "accepter", ça donne des points à l'auteur.

1 Réponse

+4 votes

le comportement est logique.
tu assigne au paramètre default le résultat de la fonction ask

de plus, l'argument "base" n'est traité qu'à l'appel de la fonction parse_args
tu dois géré le cas où base n'est pas renseigné dans un second temps

import sys
import argparse


def ask(question, default=None):
    if sys.stdout.isatty():
        return input(question)

    return default


class TestApp(object):
    def __init__(self):
        parser = argparse.ArgumentParser()

        parser.add_argument(
            "base",
            help="base a optimiser",
            nargs='?',
            default=None)

        args = parser.parse_args()
        if not args.base:
            args.base = ask("base:")


if __name__ == "__main__":
    TestApp()

Hors problématique de code, je pense qu'il y a un problème de conception :
soit l'utilisateur est libre de renseigner "base", à default None
soit l'argument est requis, et tu le précise : parser.add_argument('--foo', required=True)
soit tu rentre dans une application console, et tu demande systématiquement ( sans passage d’argument )

répondu 24-Fev-2015 par Kermit (210 points)

ouais, l'idée c'était que si l'argument n'est pas present, on prompt à l'utilisateur, mais effectivement c'est une conception assez bizarre.

...