1

docopt を使用するのは初めてで、実現しようとしている小さなコマンド ライン プログラムの引数の解析に苦労しています。

    '''Usage:
    ovh_mails.py list [--ugly]
    ovh_mails.py add (<address> [--pswd=<password>][--description=<description>] | --file <filename>)
    ovh_mails.py remove (<address> | --file <filename>)
    ovh_mails.py (-h | --help)

Arguments:
    <password>                        Password to access the mailbox (if not provided it's random generated)
    <filename>                        Name of the files to process. Check README to see how to format it

Options: 
    -h, --help                        Show this help message
    -u, --ugly                        Print without nice tables
    -p, --pswd=<password>  Set the password to the one provided

Commands:
    list                              list all the email addresses currently configured
    add                               add one or more (configured in <filename>) email addresses
    remove                            remove one ore more (configured in <filename>) email addresses'''

現時点で私が持っている引数の解析は次のとおりです。

if __name__ == '__main__':
args = docopt(__doc__)
#Validate args ---- TODO

# 'List' command parsing
if args['list']:
    if args['--ugly']:
        eman = EmailManager(niceoutput=False)
    else:
        eman = EmailManager()
    eman.list_emails()
# 'Add' command parsing
elif args['add']:
    if args['<address>']:
        eman = EmailManager()
        emails = (
                  {
                   'address': args['<address>'],
                   'password': None,
                   'description': None,
                   },
                  )
        if args['--description']:
            emails[0]['description'] = args['<description>']
        if args['--pswd']:
            emails[0]['password'] = args['<password>']
    if args['--file']:
        raise NotImplemented


    eman.add_emails(emails)


# 'remove' command parsing       
elif args['remove']:
    if args['<address>']:
        eman = EmailManager()
        emails = (
                  {
                   'address': args['<address>'],
                   },
                  )
    eman.remove_emails(emails)
    if args['--file']:
        raise NotImplemented

これを行うためのより良い、よりpythonicまたはよりエレガントな方法はありますか?

4

1 に答える 1

0

コマンドごとに検証関数を記述し、それらをvalidate辞書に入れることができます。

command = next((c for c in 'list add remove'.split() if args[c]), 'help')
try:
    validate[command](args)
except ValidationError as error:
    print_usage_and_exit(error)

docoptschemaデータ検証を推奨します。

于 2015-02-26T23:48:37.580 に答える