使用Python argparse自定义Action时出现unexpected keyword argument 'nargs'报错如何解决
错误根因
你自定义的argparse动作实现不符合规范:argparse要求自定义动作必须是继承自argparse.Action的类,但你当前将DriverAction定义为了普通函数。当add_argument构造动作实例时,会把nargs、help、required等所有参数传入动作类的初始化方法,你的函数仅接收Action一个入参,自然会抛出参数不匹配的错误,哪怕删除nargs/help也会触发其他参数的不匹配报错。
修复方案
仅需要把DriverAction的定义从函数改为类即可,其余代码无需改动:
from argparse import Action, ArgumentParser from os import pardir # 将def改为class,定义为继承Action的类 class DriverAction(Action): """ 收集驱动类型和存储目标,写入命名空间 """ def __call__(self, parser, namespace, values, option_string=None): driver, destination = values namespace.driver = driver.lower() namespace.destination = destination # 以下原有代码保持不变 def create_parser(): parser = ArgumentParser(description=""" 本地或AWS S3备份PostgreSQL数据库 """ ) parser.add_argument( "url", help="待备份的数据库URL" ) parser.add_argument( "--driver", nargs=2, action=DriverAction, required=True, help="备份的存储方式与目标位置", ) return parser def main(): import boto3 from backupdb import pgdump, storage args = create_parser().parse_args() dump = pgdump.dump(args.url) if args.driver == 's3': client = boto3.client('s3') storage.s3(client, dump.stdout, args.destination, 'mybackupdb.sql') else: with open(args.destination, 'wb') as outfile: storage.local(dump.stdout, outfile)
验证
修改完成后运行命令即可正常解析参数,示例:
backupdb postgresql://user:pass@host:port/db --driver s3 my-backup-bucket
或
backupdb postgresql://user:pass@host:port/db --driver local ./my_backup.sql
内容的提问来源于stack exchange,提问作者sam hassan
相关产品推荐
相关产品推荐

