Pregunta

Estoy escribiendo una herramienta de consulta del servidor, y tengo un poco de código a los argumentos de análisis sintáctico en la parte superior:

# Parse arguments
p = argparse.ArgumentParser()
g = p.add_mutually_exclusive_group(required=True)
g.add_argument('--odam', dest='query_type', action='store_const',
        const='odam', help="Odamex Master query.")
g.add_argument('--odas', dest='query_type', action='store_const',
        const='odas', help="Odamex Server query.")
p.add_argument('address', nargs='*')
args = p.parse_args()

# Default master server arguments.
if args.query_type == 'odam' and not args.address:
    args.address = [
            'master1.odamex.net:15000',
            'master2.odamex.net:15000',
            ]

# If we don't have any addresses by now, we can't go on.
if not args.address:
    print "If you are making a server query, you must pass an address."
    sys.exit(1)

¿Hay una manera más agradable para ello, preferentemente todos dentro del analizador? Ese último error se ve un poco fuera de lugar, y sería bueno si pudiera hacer nargs dirección dependerá de si --odam o --- se pasa odas. Podría crear un subparser, pero que haría que ayuda aspecto un poco extraño, ya que dejaría fuera de la parte direcciones del comando.

¿Fue útil?

Solución

Se puede hacer esto con una costumbre argparse.Action :

import argparse
import sys

class AddressAction(argparse.Action):
    def __call__(self, parser, args, values, option = None):
        args.address=values
        if args.query_type=='odam' and not args.address:
            args.address=[
                'master1.odamex.net:15000',
                'master2.odamex.net:15000',
                ]        
        if not args.address:
            parser.error("If you are making a server query, you must pass an address.")

p = argparse.ArgumentParser()
g = p.add_mutually_exclusive_group(required=True)
g.add_argument('--odam', dest='query_type', action='store_const',
        const='odam', help="Odamex Master query.")
g.add_argument('--odas', dest='query_type', action='store_const',
        const='odas', help="Odamex Server query.")
p.add_argument('address', nargs='*', action=AddressAction)
args = p.parse_args()

rendimientos

% test.py --odas
If you are making a server query, you must pass an address.
% test.py --odam
Namespace(address=['master1.odamex.net:15000', 'master2.odamex.net:15000'], query_type='odam')
% test.py --odam 1 2 3
Namespace(address=['1', '2', '3'], query_type='odam')
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top