Python Argparse: Nargs + أو * اعتمادًا على الوسيطة السابقة

StackOverflow https://stackoverflow.com/questions/4114996

  •  29-09-2019
  •  | 
  •  

سؤال

أنا أكتب أداة استعلام الخادم ، ولدي القليل من التعليمات البرمجية لتحليل الوسائط في الأعلى:

# 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)

هل هناك طريقة أجمل للقيام بذلك ، ويفضل أن يكون كل ذلك داخل المحلل؟ يبدو هذا الخطأ الأخير بعيدًا عن المكان ، وسيكون من الجيد أن أتمكن من جعل NARGS للعنوان يعتمد على-ODAM أو --- ODAs. يمكنني إنشاء subparser ، لكن هذا من شأنه أن يجعل المساعدة تبدو غريبة بعض الشيء لأنه سيترك عناوين جزء من الأمر.

هل كانت مفيدة؟

المحلول

يمكنك القيام بذلك مع العرف 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()

عائدات

% 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')
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top