আরগপার্স পাইথন ইনপুট আর্গুমেন্টের জন্য ফর্ম্যাট নির্দিষ্ট করুন


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
@ স্টিভেনভ্যাসেল্লারো হ্যাঁ, তবে এটিই এপিআই সংজ্ঞা দেয়; ডক্স থেকে উদ্ধৃতি হিসাবে "একটি একক স্ট্রিং আর্গুমেন্ট নেয়"
জোনারশপে

71

কেবলমাত্র উপরের উত্তরের সাথে যুক্ত করতে, আপনি যদি এটি ওয়ান-লাইনারে রাখতে চান তবে লাম্বদা ফাংশনটি ব্যবহার করতে পারেন। উদাহরণ স্বরূপ:

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

পুরানো থ্রেড তবে প্রশ্নটি এখনও আমার পক্ষে প্রাসঙ্গিক ছিল কমপক্ষে!


6
এটি একটি দুর্দান্ত কৌশল, যদিও আপনি কিছু অবৈধ পাস করেন তবে ত্রুটির বার্তাটি কেবল হবেinvalid <lambda> value
ব্র্যাড সলোমন

38

অন্যরা যারা অনুসন্ধান ইঞ্জিনগুলির মাধ্যমে এটি হিট করেছে: পাইথন ৩.7-তে, আপনি .fromisoformatISO-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।
ল্যারিক্স ডেসিডুয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.