अजगर के तर्क को गैर-मान्यता प्राप्त तर्कों को अनदेखा करते हैं


206

ऑप्टपर्स, पुराने संस्करण में सभी अपरिचित तर्कों को अनदेखा किया जाता है। ज्यादातर स्थितियों में, यह आदर्श नहीं है और इसे परिवर्तन में बदल दिया गया था। लेकिन कुछ परिस्थितियाँ ऐसी होती हैं जहाँ आप किसी भी अपरिचित तर्क को नज़रअंदाज़ करना चाहते हैं और आपके द्वारा निर्दिष्ट लोगों को पार्स करते हैं।

उदाहरण के लिए:

parser = argparse.ArgumentParser()
parser.add_argument('--foo', dest="foo")
parser.parse_args()

$python myscript.py --foo 1 --bar 2
error: unrecognized arguments: --bar

वहाँ वैसे भी यह अधिलेखित करने के लिए है?


14
बहुत आसान है अगर आप किसी अन्य प्रोग्राम के लिए एक आवरण लिख रहे हैं, और आप कुछ तर्कों को पकड़ना और संशोधित करना चाहते हैं, लेकिन बाकी को पास कर दें!
एलन डे स्मेट

2
बिल्कुल क्यों मैं यहाँ @AlanDeSmet समाप्त हो गया! खुशी है कि मैं कुछ पागल करने की कोशिश नहीं कर रहा हूँ :)
dwanderson 21

जवाबों:


351

बदलने के

args = parser.parse_args()

साथ में

args, unknown = parser.parse_known_args()

उदाहरण के लिए,

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo')
args, unknown = parser.parse_known_args(['--foo', 'BAR', 'spam'])
print(args)
# Namespace(foo='BAR')
print(unknown)
# ['spam']

21
+1 - नहीं पता था कि कुछ चीज है जैसेparse_known_args
avasal

7
न ही मैं! मैंने इसे डॉक्स डॉक्सहोमथोन . org/library/… में भी मिस किया । धन्यवाद
joedborg

1
यह तब आया जब पार्सार्ग के साथ नोसेटेस्ट का उपयोग करने की कोशिश की गई (इसने नोसेटेस्ट आर्ग्स का उपयोग करने की अनुमति देने से इनकार कर दिया) इसका कारण यह था कि मैं अपने परीक्षणों के parser.parse_args(None)बजाय कर रहा था parser.parse_args([])
एंडी हेडन

3
FWIW, के parse_known_argsबजाय का उपयोग करने में parse_argsसक्षम करता ArgumentParserहै कोड के उपयोग के दायरे में if __name__ == 'main':(एक शर्त है कि Trueएक IPython नोटबुक में सभी कोशिकाओं के लिए है ... जो मैं बहुत विकास और परीक्षण कोड है कि मैं अंततः एक स्क्रिप्ट के लिए स्थानांतरित करना चाहता हूँ एड्स एड्स एक कमांड लाइन से)
gumption

1
यह वैकल्पिक आर्ग के साथ काम नहीं करता है जो "ज्ञात" हैं, जिसमें पारित नहीं किया जा रहा है।
शारुद

21

parser.add_argument('args', nargs=argparse.REMAINDER)यदि आप उनका उपयोग करना चाहते हैं तो आप शेष भागों को एक नए तर्क में डाल सकते हैं।


1
यह काम करता है parse_args()और इसकी आवश्यकता नहीं है parse_known_args()(पायथन 2.7 पर)।
OozeMeister

4
Argparse.REMAINDER का उपयोग करना लंबे समय तक चलने वाले कीड़ों से भरा हुआ लगता है। मैं निश्चित रूप से यह काम करने के लिए नहीं मिल सकता है। parse_ogn_args () एक अच्छा विकल्प है।
मैट

1
बस आज एक लंबे समय से चली आ रही REMAINDER बग में भाग गया: bugs.python.org/issue17050
स्कॉट कारपेंटर

7

वास्तव में अरगर्से अभी भी "उपेक्षा" करते हैं _unrecognized_args। जब तक ये "गैर-मान्यता प्राप्त" तर्क डिफ़ॉल्ट उपसर्ग का उपयोग नहीं करते हैं, तो आप पार्सर से कोई शिकायत नहीं सुनेंगे।

@ Anutbu के कॉन्फ़िगरेशन का उपयोग करना parse.parse_args(), लेकिन मानक के साथ , अगर हम निम्नलिखित तर्कों के साथ अपने कार्यक्रम को निष्पादित करना चाहते थे।

$ program --foo BAR a b +cd e

हमारे पास काम करने के लिए यह नामांकित डेटा संग्रह होगा।

Namespace(_unrecognized_args=['a', 'b', '+cd', 'e'], foo='BAR')

यदि हम चाहते थे कि डिफ़ॉल्ट उपसर्ग को -अनदेखा किया जाए तो हम ArgumentParser को बदल सकते हैं और तय कर सकते हैं कि हम +इसके बजाय अपने "मान्यता प्राप्त" तर्कों के लिए उपयोग करने जा रहे हैं ।

parser = argparse.ArgumentParser(prefix_chars='+')
parser.add_argument('+cd')

वही कमांड प्रोड्यूस करेगा

Namespace(_unrecognized_args=['--foo', 'BAR', 'a', 'b'], cd='e')

इसे अपने पाइप में रखें और इसे धूम्रपान करें =)

एन ज्वॉय!

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