আরগপার্স optionচ্ছিক যুক্তি সেট করা আছে কিনা তা পরীক্ষা করুন


112

আমি চেক করতে চাই যে কোনও byচ্ছিক আরগপার্স যুক্তি ব্যবহারকারী দ্বারা সেট করা হয়েছে কিনা।

আমি কী নিরাপদে isset ব্যবহার করে চেক করতে পারি?

এটার মতো কিছু:

if(isset(args.myArg)):
    #do something
else:
    #do something else

এটি কি ভাসমান / ইনট / স্ট্রিং ধরণের আর্গুমেন্টের জন্য একই কাজ করে?

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


1
কী হবে isset()(ইঙ্গিত: পাইথন পিএইচপি নয়)? আপনি কি hasattr()পরিবর্তে বলতে চেয়েছিলেন, সম্ভবত? পরিবর্তে কোনও বিকল্পের জন্য ডিফল্ট সেট করতে আরগপার্সকে কনফিগার করবেন না কেন?
মার্টিজন পিটারস

@ মার্তিজজনপিটার্স - হ্যাঁ, সত্য। (Args.myArg) আমি কি সহজেই যাচাই করতে পারি: ...
মেডেলিন পি। ভিনসেন্ট

উত্তর:


146

আমি মনে করি যে সরবরাহ না করা হলে (চ্ছিক আর্গুমেন্টগুলি (এর সাথে সুনির্দিষ্ট --) আরম্ভ Noneকরা হয়। সুতরাং আপনি পরীক্ষা করতে পারেন is not None। নীচের উদাহরণটি ব্যবহার করে দেখুন:

import argparse as ap

def main():
    parser = ap.ArgumentParser(description="My Script")
    parser.add_argument("--myArg")
    args, leftovers = parser.parse_known_args()

    if args.myArg is not None:
        print "myArg has been set (value is %s)" % args.myArg

"ইজ নওয়াড" এবং "ইজ নওয়াড নন" টেস্টগুলি ঠিক যেমনটি আমার পছন্দ এবং প্রত্যাশা হিসাবে কাজ করে। ধন্যবাদ।
মেডেলিন পি। ভিনসেন্ট

39
দুর্ভাগ্যক্রমে এটি কাজ করে না তারপরে যুক্তিটি এর defaultমান সংজ্ঞায়িত হয়।
কেসিআরপি

6
আপনি যদি একটি সেট করতে চান তবে ডক্সে বর্ণিত হিসাবে defaultআপনি এখনও nargs='?'একটি constমান সেট এবং সরবরাহ করতে পারেন । আরগটি অনুপস্থিত থাকলে, ব্যবহৃত হয়, যখন আর্গ w / o মান দেওয়া হয়, তখন ব্যবহৃত হয়, অন্যথায় প্রদত্ত মান ব্যবহার করা হয়। শুধুমাত্র এবং , যদি দেওয়া হয় না, যদি ডাব্লু / ওউ মান দেওয়া হয়, অন্যথায় প্রদত্ত মান ব্যবহার করা হয়। defaultconstdefaultnargs='?'defaultNone
আয়নানস ফিলিপিসিস 26'17

@ আইওনিসফিলিপিডিস আপনি যদি ব্যবহার করেন action= "store_true"বা action="store_const", const="yourconst"আপনি অন্য মান সংরক্ষণ করতে সেই যুক্তিটি ব্যবহার করতে না পারেন। ডিফল্ট ব্যবহার করার সময় এটি কাজ করবে না। আমি নিজেই আরগ পার্সার থেকে সমস্ত ডিফল্ট অপসারণ করেছি এবং অন্য একটি ফাংশনের ভিতরে def defaults():যেখানে আমি কনফিগার পার্সার, আর্গুমেন্ট পার্সার এবং ডিফল্ট মানগুলিকে মিশ্রিত করি তার সাথে আমি পরিচালনা করেছি
এম

@ erm3nda আমি একটি সেট করার কথা উল্লেখ করি নি action। উত্তরটি একটি ব্যবহার করে না action। আপনি যে ক্রিয়াগুলি উল্লেখ করেছেন সেগুলি একটি নির্দিষ্ট উপায়ে আচরণ করার জন্য নথিভুক্ত করা হয় (যেমন আপনি পর্যবেক্ষণ করেছেন)। যদিও কোনও ক্রিয়া সংজ্ঞায়িত করা প্রয়োজন হয় না।
আইওনিস ফিলিপিসিস

37

যেহেতু @ হোঞ্জা নোটগুলি is Noneএকটি ভাল পরীক্ষা। এটি ডিফল্ট default, এবং ব্যবহারকারী আপনাকে একটি স্ট্রিং দিতে পারে না যা এটির নকল করে।

আপনি অন্য নির্দিষ্ট করতে পারেন default='mydefaultvalue এবং তার জন্য পরীক্ষা । কিন্তু যদি ব্যবহারকারী সেই স্ট্রিংটি নির্দিষ্ট করে? সেটিকে সেটিং হিসাবে গণনা করা হয় কি না?

আপনি নির্দিষ্ট করতে পারেন default=argparse.SUPPRESS। তারপরে যদি ব্যবহারকারী আর্গুমেন্টটি ব্যবহার না করে তবে এটি argsনেমস্পেসে উপস্থিত হবে না । তবে পরীক্ষা আরও জটিল হতে পারে:

args.foo # raises an AttributeError
hasattr(args, 'foo')  # returns False
getattr(args, 'foo', 'other') # returns 'other'

অভ্যন্তরীণভাবে parserএকটি তালিকা রাখে seen_actionsএবং এটি 'প্রয়োজনীয়' এবং 'মিউচুয়াল_ এক্সক্লুসিভ' পরীক্ষার জন্য ব্যবহার করে। তবে এটি আপনার পক্ষে আর উপলভ্য নয় parse_args


22

আমি মনে করি বিকল্পটি ব্যবহার করা সার্থক করে default=argparse.SUPPRESSতোলে। তারপরে, আর্গুমেন্ট কিনা তা যাচাই করার পরিবর্তে not None, একটি আর্গুমেন্ট কিনা তা পরীক্ষা করেin ফলাফলের নামস্থান ।

উদাহরণ:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--foo", default=argparse.SUPPRESS)
ns = parser.parse_args()

print("Parsed arguments: {}".format(ns))
print("foo in namespace?: {}".format("foo" in ns))

ব্যবহার:

$ python argparse_test.py --foo 1
Parsed arguments: Namespace(foo='1')
foo in namespace?: True
তর্ক সরবরাহ করা হয় না:
$ python argparse_test.py
Parsed arguments: Namespace()
foo in namespace?: False

পাইথন ৩.7.৫ (অ্যানাকোন্ডা) এর আওতায় এটি আমার পক্ষে কাজ করছে না। আমি ফলাফলটি পেয়েছিtestfoo.py: error: argument --foo: expected one argument
মাইক ওয়াইজ

@ মাইকওয়াইজ আপনি যদি --fooকোনও মান ছাড়াই (যেমন 1আমার উদাহরণে) ব্যবহার করতে চান তবে আপনাকে ফাংশনে নির্দিষ্ট nargs=0করতে add_argumentহবে।
ইরাসমাস সিডার্নেস

আমি উত্তরটিতে বর্ণিত হিসাবে আপনার কোডটি অনুলিপি করে আটকিয়েছি। সম্ভবত আপনি এটি সম্পাদনা করা উচিত? আমি action='store_true'আমার আসল কোডের পরিবর্তে নীচের উত্তরটি ব্যবহার করে শেষ করেছি।
মাইক ওয়াইজ

@ মাইকওয়াইজ আপনি কি স্ক্রিপ্টটি চালিয়েছেন python argparse_test.py --foo 1?
ইরাসমাস সিডার্নেস

11

আপনি যুক্তিযুক্ত ক্রিয়া store_trueএবং store_falseবিকল্পের বিকল্পগুলি সহ একটি allyচ্ছিকভাবে পাস হওয়া পতাকাটি পরীক্ষা করতে পারেন :

import argparse

argparser = argparse.ArgumentParser()
argparser.add_argument('-flag', dest='flag_exists', action='store_true')

print argparser.parse_args([])
# Namespace(flag_exists=False)
print argparser.parse_args(['-flag'])
# Namespace(flag_exists=True)

এইভাবে, আপনাকে শর্তসাপেক্ষে পরীক্ষা করার বিষয়ে চিন্তা করতে হবে না is not None। আপনি কেবল Trueবা জন্য পরীক্ষা করুন False। দস্তাবেজে এই বিকল্পগুলি সম্পর্কে আরও পড়ুন এখানে


1
এটির সাথে এটির সমাধান হয় না যে একটি যুক্তি রয়েছে যার একটি মান রয়েছে কিনা সেট করা আছে। এখানে মূল সমস্যাটি হ'ল আরগ্স মানটি ডিফল্ট = "" থেকে আসে কিনা বা এটি ব্যবহারকারী দ্বারা সরবরাহ করা হয় তা জানা।
m3nda

5

যদি আপনার যুক্তি অবস্থানগত হয় (যেমন এটিতে "-" বা "-" উপসর্গ নেই, কেবল যুক্তি, সাধারণত একটি ফাইলের নাম) তবে আপনি এটি করার জন্য ন্যাংগুলি প্যারামিটার ব্যবহার করতে পারেন :

parser = argparse.ArgumentParser(description='Foo is a program that does things')
parser.add_argument('filename', nargs='?')
args = parser.parse_args()

if args.filename is not None:
    print('The file name is {}'.format(args.filename))
else:
    print('Oh well ; No args, no problems')

3

আমি আরগপার্স ভেরিয়েবল ব্যবহার করছি কিনা তা দেখার জন্য এখানে আমার সমাধান রয়েছে

import argparse

ap = argparse.ArgumentParser()
ap.add_argument("-1", "--first", required=True)
ap.add_argument("-2", "--second", required=True)
ap.add_argument("-3", "--third", required=False) 
# Combine all arguments into a list called args
args = vars(ap.parse_args())
if args["third"] is not None:
# do something

এটি উপরের উত্তরটিকে আরও অন্তর্দৃষ্টি দিতে পারে যা আমি আমার প্রোগ্রামের জন্য কাজ করতে ব্যবহার করেছি এবং মানিয়ে নিয়েছি।


0

@ কেনজা ওসোবনে (বর্তমানে স্বীকৃত) উত্তরে @ কেসিআরপির মন্তব্যে সম্বোধন করার জন্য

দুর্ভাগ্যক্রমে এটি কাজ করে না তারপরে যুক্তিটি এটির ডিফল্ট মান সংজ্ঞায়িত করে।

প্রথমে বিকল্পটি Namespaceঅবজেক্ট default=argparse.SUPPRESSঅ্যাবডের সাথে তুলনা করে আর্গুমেন্টটি সরবরাহ করা হয়েছিল কিনা তা পরীক্ষা করতে পারবেন (@ এইচপিউলজ এবং @ ইরসমাস সিডার্নেস উত্তর এবং এই পাইথন 3 ডকটি দেখুন ) এবং যদি এটি সরবরাহ না করা থাকে, তবে এটি একটি ডিফল্ট মানতে সেট করুন।

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--infile', default=argparse.SUPPRESS)
args = parser.parse_args()
if 'infile' in args: 
    # the argument is in the namespace, it's been provided by the user
    # set it to what has been provided
    theinfile = args.infile
    print('argument \'--infile\' was given, set to {}'.format(theinfile))
else:
    # the argument isn't in the namespace
    # set it to a default value
    theinfile = 'your_default.txt'
    print('argument \'--infile\' was not given, set to default {}'.format(theinfile))

ব্যবহার

$ python3 testargparse_so.py
argument '--infile' was not given, set to default your_default.txt

$ python3 testargparse_so.py --infile user_file.txt
argument '--infile' was given, set to user_file.txt

0

খুব সহজ, 'আরগস = পার্সার.পারস_আর্গস ()' দ্বারা আর্গ ভেরিয়েবল সংজ্ঞায়িত করার পরে এতে আরগস সাবসেট ভেরিয়েবলের সমস্ত ডেটা রয়েছে। কোনও ভেরিয়েবল সেট আছে কিনা বা ধরে নেওয়া 'ক্রিয়া = "স্টোর_ট্রু" ব্যবহার করা হচ্ছে কিনা তা পরীক্ষা করতে ...

if args.argument_name:
   # do something
else:
   # do something else
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.