You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:06:04