इनपुट तर्कों के लिए प्रारूप निर्दिष्ट करें अजगर अजगर


111

मेरे पास एक पायथन लिपि है जिसमें कुछ कमांड लाइन इनपुट की आवश्यकता होती है और मैं उन्हें पार्स करने के लिए आर्गपार्स का उपयोग कर रहा हूं। मैंने दस्तावेज़ीकरण को थोड़ा भ्रमित किया और इनपुट मापदंडों में एक प्रारूप की जांच करने का कोई तरीका नहीं खोज सका। प्रारूप की जाँच से मेरा क्या अभिप्राय है इस उदाहरण लिपि से समझाया गया है:

parser.add_argument('-s', "--startdate", help="The Start Date - format YYYY-MM-DD ", required=True)
parser.add_argument('-e', "--enddate", help="The End Date format YYYY-MM-DD (Inclusive)", required=True)
parser.add_argument('-a', "--accountid", type=int, help='Account ID for the account for which data is required (Default: 570)')
parser.add_argument('-o', "--outputpath", help='Directory where output needs to be stored (Default: ' + os.path.dirname(os.path.abspath(__file__)))

मुझे विकल्प की जांच करने की आवश्यकता है -sऔर -eउपयोगकर्ता द्वारा इनपुट प्रारूप में है YYYY-MM-DD। क्या इस बात का कोई विकल्प नहीं है कि मुझे यह पता नहीं है कि यह किससे पूरा होता है।

जवाबों:


235

प्रति प्रलेखन :

typeके कीवर्ड तर्क add_argument()किसी भी आवश्यक प्रकार की जाँच और प्रकार रूपांतरण प्रदर्शन किया जा करने की अनुमति देता ... type=किसी भी प्रतिदेय है कि एक एकल स्ट्रिंग तर्क और रिटर्न परिवर्तित मूल्य लेता है ले जा सकते हैं

आप कुछ ऐसा कर सकते हैं:

def valid_date(s):
    try:
        return datetime.strptime(s, "%Y-%m-%d")
    except ValueError:
        msg = "Not a valid date: '{0}'.".format(s)
        raise argparse.ArgumentTypeError(msg)

फिर उस का उपयोग करें type:

parser.add_argument("-s", 
                    "--startdate", 
                    help="The Start Date - format YYYY-MM-DD", 
                    required=True, 
                    type=valid_date)

आपके द्वारा संपादित किए गए अन्य प्रश्न के बारे में क्या आप मुझे इसके लिए दस्तावेज (यदि कोई हो) के लिए इंगित कर सकते हैं?
सोहाइब

क्या valid_date()माना कि दिया गया तर्क एक तार है?
स्टेवोइसेक

1
@StevenVascellaro हाँ, लेकिन यही एपीआई परिभाषित करता है; डॉक्स से उद्धरण के अनुसार "एकल स्ट्रिंग तर्क लेता है"
jonrsharpe

71

बस ऊपर दिए गए उत्तर पर जोड़ने के लिए, आप एक लैम्ब्डा फ़ंक्शन का उपयोग कर सकते हैं यदि आप इसे एक-लाइनर पर रखना चाहते हैं। उदाहरण के लिए:

parser.add_argument('--date', type=lambda d: datetime.strptime(d, '%Y%m%d'))

पुराना धागा लेकिन सवाल अभी भी कम से कम मेरे लिए प्रासंगिक था!


6
यह एक अच्छी चाल है, हालांकि यदि आप कुछ अमान्य पारित करते हैं, तो त्रुटि संदेश बस होगाinvalid <lambda> value
ब्रैड सोलोमन

38

दूसरों के लिए जो इसे खोज इंजन के माध्यम से मारते हैं: पायथन 3.7 में, आप .fromisoformatआईएसओ -8601 अनुरूप तारीखों के लिए पहिया को फिर से मजबूत करने के बजाय मानक वर्ग विधि का उपयोग कर सकते हैं , जैसे:

parser.add_argument('-s', "--startdate",
    help="The Start Date - format YYYY-MM-DD",
    required=True,
    type=datetime.date.fromisoformat)
parser.add_argument('-e', "--enddate",
    help="The End Date format YYYY-MM-DD (Inclusive)",
    required=True,
    type=datetime.date.fromisoformat)

5
इसके अलावा, dateutilके आईएसओ पार्सर अतिरिक्त fmts है कि अभी भी आईएसओ 8601-2004 पालन करने वाले की संख्या में ले जाता है। आप उपयोग कर सकते हैं import dateutil.parser-> type=dateutil.parser.isoparseयाtype=dateutil.parser.parse
ब्रैड सुलैमान

@ ब्रैडसोलोमन वास्तव में एक अच्छा सुझाव है (इसलिए मेरा +1), लेकिन dateutilएक तृतीय-पक्ष पैकेज है। किसी को अतिरिक्त स्थापित करने के (छोटे) झंझट के विरुद्ध इसके लाभों का न्याय करना होगा। YMMV।
लेरिक्स डेसीडुआ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.