পাইথন আরগপার্সে মিউচুয়াল এক্সক্লুসিভ গ্রুপ


92

আমার যা দরকার তা হ'ল:

pro [-a xxx | [-b yyy -c zzz]]

আমি এটি চেষ্টা করেছিলাম কিন্তু কাজ করে না। আমাকে কেউ সাহায্য করতে পারেন?

group= parser.add_argument_group('Model 2')
group_ex = group.add_mutually_exclusive_group()
group_ex.add_argument("-a", type=str, action = "store", default = "", help="test")
group_ex_2 = group_ex.add_argument_group("option 2")
group_ex_2.add_argument("-b", type=str, action = "store", default = "", help="test")
group_ex_2.add_argument("-c", type=str, action = "store", default = "", help="test")

ধন্যবাদ!



প্লাগিং, তবে আমি আমার লাইব্রেরি জোফ্রে উল্লেখ করতে চেয়েছিলাম । উদাহরণস্বরূপ, আপনাকে সাবকম্যান্ড ব্যবহার না করে (স্বীকৃত উত্তরের মতো) নিজেরাই সবকিছু যাচাই বাছাই করুন (দ্বিতীয় সর্বোচ্চ ভোটের প্রতিক্রিয়া অনুসারে) এই প্রশ্নটি যা চায় তা আপনাকে করতে দেয়।
আরে

উত্তর:


110

add_mutually_exclusive_groupএকটি সম্পূর্ণ গ্রুপ পারস্পরিক একচেটিয়া না। এটি গ্রুপের মধ্যে পারস্পরিক একচেটিয়া অপশন তৈরি করে।

আপনি কি খুঁজছেন subcommands । প্রগের পরিবর্তে [-a xxxx | [-b yyy -c zzz]], আপনি চাইতেন:

prog 
  command 1 
    -a: ...
  command 2
    -b: ...
    -c: ...

আর্গুমেন্টের প্রথম সেটটি সহ প্রার্থনা করা:

prog command_1 -a xxxx

দ্বিতীয় সেটটি যুক্তি দিয়ে প্রার্থনা করা:

prog command_2 -b yyyy -c zzzz

আপনি সাব-কমান্ড আর্গুমেন্টকে অবস্থানগত হিসাবেও সেট করতে পারেন।

prog command_1 xxxx

গিট বা এসএনএন এর মতো:

git commit -am
git merge develop

কাজের উদাহরণ

# create the top-level parser
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('--foo', action='store_true', help='help for foo arg.')
subparsers = parser.add_subparsers(help='help for subcommand')

# create the parser for the "command_1" command
parser_a = subparsers.add_parser('command_1', help='command_1 help')
parser_a.add_argument('a', type=str, help='help for bar, positional')

# create the parser for the "command_2" command
parser_b = subparsers.add_parser('command_2', help='help for command_2')
parser_b.add_argument('-b', type=str, help='help for b')
parser_b.add_argument('-c', type=str, action='store', default='', help='test')

এটা পরীক্ষা করো

>>> parser.print_help()
usage: PROG [-h] [--foo] {command_1,command_2} ...

positional arguments:
  {command_1,command_2}
                        help for subcommand
    command_1           command_1 help
    command_2           help for command_2

optional arguments:
  -h, --help            show this help message and exit
  --foo                 help for foo arg.
>>>

>>> parser.parse_args(['command_1', 'working'])
Namespace(a='working', foo=False)
>>> parser.parse_args(['command_1', 'wellness', '-b x'])
usage: PROG [-h] [--foo] {command_1,command_2} ...
PROG: error: unrecognized arguments: -b x

শুভকামনা।


আমি তাদের ইতিমধ্যে একটি যুক্তি গোষ্ঠীর আওতায় রেখেছি। এই ক্ষেত্রে আমি কীভাবে সাব-কমান্ড যুক্ত করতে পারি? ধন্যবাদ!
শান

4
নমুনা কোড সহ আপডেট হয়েছে। আপনি গ্রুপগুলি ব্যবহার করবেন না, তবে সাব-পার্সার ব্যবহার করবেন।
জোনাথন

7
তবে ওপি যা বলেছিল তা কীভাবে করবেন? আমার কাছে বর্তমানে সাব-কমান্ডগুলির একটি সেট রয়েছে তবে সেই সাব-কমান্ডগুলির মধ্যে [[-a <val>] | [-b <val1> -c <val2>]]
একটির

4
এটি প্রশ্নের উত্তর দেয় না কারণ এটি আপনাকে "ননাম" কমান্ড তৈরি করতে ও ওপি যা চেয়েছিল তা অর্জন করতে দেয় না[-a xxx | [-b yyy -c zzz]]
দ্য গডফাদার

38

যদিও যোনাথনের উত্তর জটিল বিকল্পের জন্য পুরোপুরি জরিমানা, একটি খুব সহজ সমাধান যা সহজ ক্ষেত্রে জন্য কাজ করবে, মত 2 অন্যান্য অপশন 1 বিকল্প বাদ যেমন হয়

command [- a xxx | [ -b yyy | -c zzz ]] 

এমনকি মূল প্রশ্নেও:

pro [-a xxx | [-b yyy -c zzz]]

আমি এখানে এটি কীভাবে করব:

parser = argparse.ArgumentParser()

# group 1 
parser.add_argument("-q", "--query", help="query", required=False)
parser.add_argument("-f", "--fields", help="field names", required=False)

# group 2 
parser.add_argument("-a", "--aggregation", help="aggregation",
                    required=False)

আমি এখানে মংডোব জিজ্ঞাসা করার জন্য একটি কমান্ড লাইন মোড়কে দেওয়া বিকল্পগুলি ব্যবহার করছি। collectionউদাহরণ হিসেবে বলা যায় পারেন পদ্ধতি কল করতে পারেন aggregateবা পদ্ধতি findঐচ্ছিক আর্গুমেন্ট সঙ্গে queryএবং fields, অত আপনি দেখতে কেন প্রথম দুই আর্গুমেন্ট সামঞ্জস্যপূর্ণ এবং গত এক নয়।

সুতরাং এখন আমি এটি চালাচ্ছি parser.parse_args()এবং এটির বিষয়বস্তু যাচাই করি:

args = parser().parse_args()

print args.aggregation
if args.aggregation and (args.query or args.fields):
    print "-a and -q|-f are mutually exclusive ..."
    sys.exit(2)

অবশ্যই, এই ছোট্ট হ্যাকটি কেবল সহজ কেসগুলির জন্য কাজ করছে এবং আপনার যদি অনেক পারস্পরিক একচেটিয়া বিকল্প এবং গোষ্ঠী থাকে তবে সমস্ত সম্ভাব্য বিকল্পগুলি চেক করা দুঃস্বপ্ন হয়ে উঠবে। সেক্ষেত্রে জোনাথনের পরামর্শ অনুসারে কমান্ড গোষ্ঠীতে আপনার বিকল্পগুলি ভেঙে দেওয়া উচিত।


4
আমি এই মামলার জন্য এটিকে 'হ্যাক' বলব না, যেহেতু এটি আরও পাঠযোগ্য এবং পরিচালনাযোগ্য উভয়ই মনে হচ্ছে - এটি দেখানোর জন্য ধন্যবাদ!
ঋষি

16
আরও ভাল উপায় ব্যবহার করা হবে parser.error("-a and -q ...")। এইভাবে সম্পূর্ণ ব্যবহারের সহায়তা স্বয়ংক্রিয়ভাবে মুদ্রণ করা হবে।
ডাব্লুজিএইচ

দয়া করে নোট করুন যে এক্ষেত্রে আপনারও যেমন কেসগুলি বৈধ করাতে হবে: (1) উভয় ক্ষেত্রে qএবং fপ্রথম গোষ্ঠীতে ব্যবহারকারী প্রয়োজন হয়, (2) উভয় দলের প্রয়োজন। এবং এটি "সরল" সমাধানটিকে এত সহজ করে না। সুতরাং আমি সম্মত হব যে এটি হস্তশিল্পের স্ক্রিপ্টের জন্য আরও হ্যাক, তবে আসল সমাধান নয়
দ্য গডফাদার

4

এখানে পাইথন প্যাচ রয়েছে (বিকাশে) যা আপনাকে এটি করতে দেয়।
http://bugs.python.org/issue10984

ধারণাটি হ'ল পারস্পরিক একচেটিয়া গোষ্ঠীকে ওভারল্যাপ করার অনুমতি দেওয়া। সুতরাং usageদেখতে যেমন হতে পারে:

pro [-a xxx | -b yyy] [-a xxx | -c zzz]

আরগপার্স কোড পরিবর্তন করা যাতে আপনি দুটি গ্রুপ তৈরি করতে পারেন তবে এটি ছিল সহজ অংশ। usageবিন্যাস কোড পরিবর্তন করার জন্য একটি কাস্টম লেখার প্রয়োজন HelpFormatter

ইন argparse, অ্যাকশন গ্রুপগুলি পার্সিংকে প্রভাবিত করে না। তারা কেবল একটিhelp বিন্যাসের সরঞ্জাম। মধ্যে help, পারস্পরিক একচেটিয়া গোষ্ঠীগুলি কেবল usageরেখাকে প্রভাবিত করে । যখন পার্স, parserসম্ভাব্য দ্বন্দ্বের একটি অভিধান (গঠন করা পারস্পরিক একচেটিয়া গ্রুপ ব্যবহার aসঙ্গে ঘটতে করতে পারবে না bবা c, bসঙ্গে ঘটতে করতে পারবে না a, ইত্যাদি), এবং তারপর যদি একটি দ্বন্দ্ব দেখা দেয় দুটো কারণে একটি ত্রুটি উত্থাপন।

আরগপার্স প্যাচ ছাড়া আমার মনে হয় আপনার সেরা পছন্দটি parse_argsনিজের দ্বারা উত্পাদিত নেমস্পেসটি পরীক্ষা করা (উদাহরণস্বরূপ যদি উভয়ই থাকে aএবং bনন-ডিফল্ট মান রয়েছে), এবং নিজের ত্রুটি বাড়িয়ে তোলা। এমনকি আপনি পার্সারের নিজস্ব ত্রুটি প্রক্রিয়াটিও ব্যবহার করতে পারেন।

parser.error('custom error message')

4
পাইথন ইস্যু: bugs.python.org/issue11588 আপনাকে কাস্টম এক্সক্লুসিভ / ইনক্লুসিভ টেস্ট লিখতে দেওয়ার উপায়গুলি অন্বেষণ করছে।
এইচপলজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.