1

我希望为我的解析器提供灵活的输入。我的用例是我有一个 python 脚本来运行一些基于日期范围的查询。我希望 arg 解析器如何操作是,如果只提供一个日期,则将该日期用作开始日期和结束日期,但如果使用两个日期,则使用这些日期。

因此,至少需要提供一个日期,但不能超过两个日期。那可能吗?

def main(args):
    parser = argparse.ArgumentParser(description="Run ETL for script")
    
    parser.add_argument('-j', '--job_name', action='store', default=os.path.basename(__file__), type=str, help="Job name that gets used as part of the metadata for the job run.")
    parser.add_argument("-d", "--date-range", nargs=2, metavar=('start_date', 'end_date'), default=['2021-01-01', '2021-01-01'], action='store', help="Operating range for script and data sources (as applicable)")
    parser.add_argument('-e', '--env', action='store', choices=['dev', 'stage', 'prod'], default='dev', help="Environment to execute.")
    parser.add_argument('-c', '--config', action='store', choices=['small', 'medium', 'large'], default='small', help="Resource request.  See configs for each.") 
    
    args = parser.parse_args()
    
    if args.date_range[0] <= args.date_range[1]:
        job_meta = {
            "script" : args.job_name,
            "start_date" : args.date_range[0],
            "end_date" : args.date_range[1],
            "environment" : args.env,
            "resource" : args.config
        }
        run_job(job_meta)
    else:
        print('Invalid date range.  Start date as inputted may be following the end date.')
        sys.exit(0)

if __name__ == "__main__":
    main(sys.argv[1:])

4

1 回答 1

1

为了实现这一点,您可以创建一个新操作来检查提供给 nargs 的参数数量。

import argparse

class LimitedAppend(argparse._AppendAction):
    def __call__(self, parser, namespace, values, option_string=None):
        if not (1 <= len(values) <= 2):
            raise argparse.ArgumentError(self, "%s takes 1 or 2 values, %d given" % (option_string, len(values)))
        super().__call__(parser, namespace, values, option_string)


parser.add_argument("-d", "--date-range", ..., nargs='+', action=LimitedAppend)

然后你可以检查这个参数的长度并做你想做的事

于 2021-09-16T22:48:32.417 回答