जाँच करें कि क्या वैकल्पिक तर्क सेट है या नहीं


112

मैं यह जांचना चाहूंगा कि क्या उपयोगकर्ता द्वारा एक वैकल्पिक तर्क-वितर्क निर्धारित किया गया है या नहीं।

क्या मैं सुरक्षित रूप से isset का उपयोग करके देख सकता हूँ?

कुछ इस तरह:

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

क्या यह फ्लोट / इंट / स्ट्रिंग प्रकार के तर्कों के लिए समान है?

मैं एक डिफ़ॉल्ट पैरामीटर सेट कर सकता हूं और इसकी जांच कर सकता हूं (जैसे, myArg = -1 सेट करें, या "" स्ट्रिंग के लिए, या "NOT_SET")। हालाँकि, जो मूल्य मैं अंततः उपयोग करना चाहता हूं, उसकी गणना बाद में स्क्रिप्ट में की जाती है। इसलिए मैं इसे डिफ़ॉल्ट के रूप में -1 पर सेट करूंगा, और फिर बाद में इसे कुछ और अपडेट करूंगा। यह केवल उपयोगकर्ता द्वारा निर्धारित किया गया था, तो जाँच के साथ तुलना में थोड़ा अनाड़ी लगता है।


1
क्या होगा isset()(संकेत: पायथन PHP नहीं है)? क्या आपका मतलब hasattr()इसके बजाय था, शायद? इसके बजाय एक विकल्प के लिए डिफ़ॉल्ट सेट करने के लिए क्यों नहीं कॉन्फ़िगर करें?
मार्टिजन पीटर्स

@MartijnPieters - हाँ, सच है। तो क्या मैं आसानी से जांच कर सकता हूं कि (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मान लिया गया है कि परिभाषित किया गया है।
kcpr

6
यदि आप एक सेट करना चाहते हैं default, तो आप अभी भी सेट कर सकते हैं nargs='?'और एक constमूल्य प्रदान कर सकते हैं , जैसा कि डॉक्स में वर्णित है । जब arg अनुपस्थित defaultहोता है, तब प्रयोग किया जाता है, जब ar w / o मान constदिया जाता है , तब उपयोग किया जाता है, अन्यथा दिए गए मान का उपयोग किया जाता है। केवल defaultऔर nargs='?', defaultका उपयोग किया जाता है यदि नहीं दिया जाता है, Noneयदि w / o मान दिया जाता है, अन्यथा दिए गए मान।
आयोनिस फिलिपिपिडिस

यदि आप उपयोग करते हैं तो @IoisisFilippidis action= "store_true"या action="store_const", const="yourconst"आप उस मान का उपयोग अन्य मूल्य को संग्रहीत करने के लिए नहीं कर सकते हैं। चूक का उपयोग करते समय यह काम नहीं करेगा। अपने आप में मैंने सभी डिफॉल्ट को argparser से हटा दिया है और सभी को एक अन्य फ़ंक्शन के अंदर संभाला है def defaults():जहाँ मैं कॉन्फ़िगपार्सर, ArgumentParser और डिफॉल्ट मानों को
मिक्स

@ erm3nda मैंने एक सेटिंग का उल्लेख नहीं किया action। जवाब एक का उपयोग नहीं करता है action। आपके द्वारा उल्लिखित क्रियाएँ एक विशिष्ट तरीके से व्यवहार करने के लिए प्रलेखित हैं (जैसा कि आपने देखा)। हालांकि एक कार्रवाई को परिभाषित करना आवश्यक नहीं है।
Ioannis Filippidis

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

यह पायथन 3.7.5 (एनाकोंडा) के तहत मेरे लिए काम नहीं कर रहा है। मुझे परिणाम मिलता हैtestfoo.py: error: argument --foo: expected one argument
माइक वाइज

@MikeWise आप उपयोग करना चाहते हैं --fooएक मूल्य (यानी बिना 1मेरी उदाहरण में), आपको यह निर्दिष्ट करना nargs=0में add_argumentकार्य करते हैं।
इरास्मस सेडरनाइस

मैं उत्तर में निर्दिष्ट के अनुसार आपके कोड को कॉपी और पेस्ट करता हूं। शायद आपको इसे संपादित करना चाहिए? मैंने action='store_true'अपने वास्तविक कोड के बजाय नीचे दिए गए उत्तर का उपयोग किया ।
माइक वाइज

@ मेइक वाइज आप स्क्रिप्ट के रूप में चला python argparse_test.py --foo 1?
इरास्मस सेडरनाइस

11

आप वैकल्पिक रूप से पारित किए गए झंडे की जाँच कर सकते हैं store_trueऔर store_falseकार्रवाई विकल्प तर्क कर सकते हैं:

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
यह जानने के लिए हल नहीं होता है कि क्या एक मान जिसमें कोई मान सेट है या नहीं। यहां मुख्य समस्या यह जानना है कि क्या args का मूल्य defaul = "" से आता है या उपयोगकर्ता द्वारा इसकी आपूर्ति की जाती है।
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

@ हॉनसा ओसोबने द्वारा @ (वर्तमान में स्वीकृत) उत्तर पर @ kcpr की टिप्पणी को संबोधित करने के लिए

दुर्भाग्य से यह काम नहीं करता है, तो तर्क है कि यह डिफ़ॉल्ट मान परिभाषित है।

कोई पहले यह जांच कर सकता है Namespaceकि क्या default=argparse.SUPPRESSविकल्प प्रदान करने वाले ऑब्जेक्ट पेट के साथ तुलना करके तर्क प्रदान किया गया था (देखें @ hpaulj's और @Erasmus Cedernaes उत्तर और यह python3 doc ) और यदि यह प्रदान नहीं किया गया है, तो इसे डिफ़ॉल्ट मान पर सेट करें।

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

बहुत आसान है, 'args = parser.parse_args ()' द्वारा args चर को परिभाषित करने के बाद, इसमें args सबसेट चर के सभी डेटा भी शामिल हैं। यह जाँचने के लिए कि क्या कोई चर निर्धारित है या 'क्रिया = "store_true" का उपयोग नहीं किया गया है ...

if args.argument_name:
   # do something
else:
   # do something else
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.