আরগপার্স: "alচ্ছিক আর্গুমেন্ট" এর অধীনে প্রয়োজনীয় যুক্তিগুলি তালিকাভুক্ত করা হয়েছে?


229

আমি কিছু যুক্তি পার্স করার জন্য নিম্নলিখিত সাধারণ কোডটি ব্যবহার করি; মনে রাখবেন যে তাদের মধ্যে একটি প্রয়োজনীয়। দুর্ভাগ্যক্রমে, যখন ব্যবহারকারী যুক্তি সরবরাহ না করে স্ক্রিপ্টটি চালায়, প্রদর্শিত ব্যবহার / সহায়তা পাঠ্যটি ইঙ্গিত দেয় না যে একটি অ-nonচ্ছিক যুক্তি রয়েছে, যা আমি খুব বিভ্রান্তিকর বলে মনে করি। যুক্তিটি optionচ্ছিক নয় তা বোঝাতে আমি কীভাবে পাইথন পেতে পারি?

কোডটি এখানে:

import argparse
if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description='Foo')
    parser.add_argument('-i','--input', help='Input file name', required=True)
    parser.add_argument('-o','--output', help='Output file name', default="stdout")
    args = parser.parse_args()
    print ("Input file: %s" % args.input )
    print ("Output file: %s" % args.output )

প্রয়োজনীয় আর্গুমেন্ট সরবরাহ না করে কোডের উপরের দিকে চলার সময় আমি নিম্নলিখিত আউটপুটটি পাই:

usage: foo.py [-h] -i INPUT [-o OUTPUT]

Foo

optional arguments:
    -h, --help            show this help message and exit
    -i INPUT, --input INPUT
                          Input file name
    -o OUTPUT, --output OUTPUT
                          Output file name

5
ব্যবহারের লাইনে, -i INPUTঅংশটি বর্গাকার বন্ধনী দ্বারা বেষ্টিত নয়, যা সূক্ষ্মতা নির্দেশ করে যে প্রকৃতপক্ষে, প্রয়োজনীয়। এছাড়াও, আপনি ম্যানুয়ালি helpপ্যারামের মাধ্যমে ব্যাখ্যা করতে পারেন
জাইমে আরজিপি

7
@ জাইমআরজিপি হ্যাঁ, তবে এটি অবশ্যই যথেষ্ট নয় এবং এটি বিশিষ্টের চেয়েও কম। optional argumentsপ্রয়োজনীয় যুক্তিগুলির জন্য বরাদ্দ করা গোষ্ঠীর নাম এখনও বিভ্রান্তিকর।
একিউম্যানাস

উত্তর:


316

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

আরও দেখুন ডকুমেন্টেশন :

সাধারণভাবে, আরগপার্স মডিউল ধরে নিয়েছে যে -f এবং --bar এর মতো পতাকাগুলি alচ্ছিক আর্গুমেন্টগুলি নির্দেশ করে, যা সর্বদা কমান্ড লাইনে বাদ দিতে পারে।

দ্রষ্টব্য: প্রয়োজনীয় বিকল্পগুলি সাধারণত খারাপ ফর্ম হিসাবে বিবেচনা করা হয় কারণ ব্যবহারকারীরা বিকল্পগুলি optionচ্ছিক হওয়ার প্রত্যাশা করেন এবং সম্ভব হলে এগুলি এড়ানো উচিত।

বলা হচ্ছে, সহায়তায় শিরোনামগুলি "অবস্থানগত আর্গুমেন্ট" এবং ".চ্ছিক যুক্তি" দুটি আর্গুমেন্ট গ্রুপ দ্বারা তৈরি করা হয় যেখানে আর্গুমেন্টগুলি স্বয়ংক্রিয়ভাবে পৃথক হয়ে যায়। এখন, আপনি "এটিতে হ্যাক" করতে পারেন এবং optionচ্ছিকের নাম পরিবর্তন করতে পারেন, তবে এর চেয়ে আরও দুর্দান্ত সমাধান হ'ল "প্রয়োজনীয় নামযুক্ত যুক্তি" (বা আপনি যেগুলি কল করতে চান) এর জন্য অন্য একটি গ্রুপ তৈরি করুন:

parser = argparse.ArgumentParser(description='Foo')
parser.add_argument('-o', '--output', help='Output file name', default='stdout')
requiredNamed = parser.add_argument_group('required named arguments')
requiredNamed.add_argument('-i', '--input', help='Input file name', required=True)
parser.parse_args(['-h'])
usage: [-h] [-o OUTPUT] -i INPUT

Foo

optional arguments:
  -h, --help            show this help message and exit
  -o OUTPUT, --output OUTPUT
                        Output file name

required named arguments:
  -i INPUT, --input INPUT
                        Input file name

আমি একই সমস্যা হয়েছে। আমি আপনাকে সমাধান চেষ্টা করেছিলাম। এটি নতুন গোষ্ঠীতে যুক্তি যুক্ত করে তবে আমার কোডটি এর পরে কাজ করবে বলে মনে হচ্ছে না। কোন সমাধান প্রশংসা করা হবে। আমার কোডের সাথে লিঙ্ক করুন - পেস্টবিন.com
পিভিসি 2

1
@ জারারমাহমুদ: আপনি আপনার কোডের ২৪ লাইনে খালি যুক্তি দিয়ে যাচ্ছেন: parser.parse_args([])পরিবর্তে, parser.parse_args()sys.argv এর বিষয়বস্তু ক্যাপচার করার জন্য কোনও যুক্তি ছাড়াই ব্যবহার করুন । পের অর্গপার্স
ডেভিন

@ পোকে: চমৎকার সমাধান! আপনার যদি পারস্পরিক একচেটিয়া গোষ্ঠীগুলির প্রয়োজন হয় তবে এটি কোনও ক্ষেত্রে সহায়তা করে না বা আমি কি কিছু হারিয়ে ফেলছি?
বিচারক

@ বিচার আমি এটি পড়ার সুপারিশ করব pymotw.com/3/argparse/#mutual-exclusive-options করব
পিটার মুর

79

যেহেতু আমি alচ্ছিকের আগে প্রয়োজনীয় যুক্তিগুলির তালিকা করতে পছন্দ করি, তাই আমি এটির মাধ্যমে হ্যাক করি:

    parser = argparse.ArgumentParser()
    parser._action_groups.pop()
    required = parser.add_argument_group('required arguments')
    optional = parser.add_argument_group('optional arguments')
    required.add_argument('--required_arg', required=True)
    optional.add_argument('--optional_arg')
    return parser.parse_args()

এবং এই ফলাফলগুলি:

usage: main.py [-h] [--required_arg REQUIRED_ARG]
               [--optional_arg OPTIONAL_ARG]

required arguments:
  --required_arg REQUIRED_ARG

optional arguments:
  --optional_arg OPTIONAL_ARG

আমি helpচ্ছিক আর্গুমেন্ট গোষ্ঠীতে 'সহায়তা' না করে বাঁচতে পারি।


3
এটি কি আরগপার্সকে প্রয়োজনীয় যুক্তিগুলির সাথে কোনওরকম আচরণ করতে বাধ্য করে?
অ্যান্টনি

6
আমি মনে করি একটি যুক্তি যুক্ত করার সময় এখনও 'প্রয়োজনীয়' যুক্তিটি সেট করা দরকার।
কার্ল রোজেন

এটি সত্যি দেখতে খুব সুন্দর.
পল সেজান

7
@ অ্যান্টনি - এর জন্য আপনার অ্যাড_গারগমেন্টে 'প্রয়োজনীয় = ট্রু' দরকার নেই। উপরের উত্তরটি কেবল যুক্তি গোষ্ঠীকরণের চিত্রিত করে।
ব্যবহারকারী 2275693

47

@ কার্ল রোসেনের বিল্ডিং

parser = argparse.ArgumentParser()
optional = parser._action_groups.pop() # Edited this line
required = parser.add_argument_group('required arguments')
# remove this line: optional = parser...
required.add_argument('--required_arg', required=True)
optional.add_argument('--optional_arg')
parser._action_groups.append(optional) # added this line
return parser.parse_args()

এবং এই ফলাফলগুলি:

usage: main.py [-h] [--required_arg REQUIRED_ARG]
           [--optional_arg OPTIONAL_ARG]

required arguments:
  --required_arg REQUIRED_ARG

optional arguments:
  -h, --help                    show this help message and exit
  --optional_arg OPTIONAL_ARG

1
বিটিডাব্লু, _action_groupসুরক্ষিত সদস্য অ্যাক্সেস না করে কীভাবে অ্যাক্সেস পাওয়া যায় তার কোনও উপায় (পদ্ধতি) রয়েছে ? আমার ক্ষেত্রে ইতিমধ্যে বিদ্যমান (কাস্টম) গোষ্ঠীতে আমার কিছু যুক্তি যুক্ত করা দরকার।
machin

এটা অসাধারণ. দ্বিতীয় alচ্ছিক তালিকায় প্রদর্শিত --help আইটেমটি সমাধান করে।
জেরেমি

দ্রষ্টব্য : এই উত্তরটি উন্মুক্ত এপিআই ভেঙেছে, নীচে নীচে ব্রায়ান_ডির উত্তর চেক করুন ।
lol

18

আরও একবার, @ র‌্যালফাইজেডটি বন্ধ করে দেওয়া

এটি একের উন্মুক্ত এপিআই ভাঙবে না।

from argparse import ArgumentParser, SUPPRESS
# Disable default help
parser = ArgumentParser(add_help=False)
required = parser.add_argument_group('required arguments')
optional = parser.add_argument_group('optional arguments')

# Add back help 
optional.add_argument(
    '-h',
    '--help',
    action='help',
    default=SUPPRESS,
    help='show this help message and exit'
)
required.add_argument('--required_arg', required=True)
optional.add_argument('--optional_arg')

যা উপরের মতো দেখাবে এবং ভবিষ্যতের সংস্করণগুলিতে টিকে থাকবে:

usage: main.py [-h] [--required_arg REQUIRED_ARG]
           [--optional_arg OPTIONAL_ARG]

required arguments:
  --required_arg REQUIRED_ARG

optional arguments:
  -h, --help                    show this help message and exit
  --optional_arg OPTIONAL_ARG

আপনি কী ব্যাখ্যা করতে পারেন যে রালফিজের উত্তর কীভাবে এক্সপোজড এপিআই ভেঙে দেয়?
জেরেমিসপ্রোফাইল

5
_action_groupsশুধুমাত্র অভ্যন্তরীণ ব্যবহারের জন্য উদ্দিষ্ট। সুতরাং, সংস্করণগুলিতে কোনও সামঞ্জস্যতার গ্যারান্টি নেই।
ব্রায়ান_ডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.