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

Python argparse单元测试报错:TypeError参数数量不符求解

解决argparse单元测试中的TypeError问题

问题根源

你的单元测试报错TypeError: create() takes 1 positional argument but 2 were given,核心有三个问题:

  • create类方法定义时仅接收cls参数,但测试时传入了参数列表,导致参数不匹配
  • argparse中设置了nargs=1,会让解析后的参数值变成列表类型,但你的NamedTuple字段定义的是str,类型不匹配
  • 原代码中parse_args()默认读取系统命令行参数,单元测试时无法注入自定义测试参数

修复方案

1. 给create方法添加测试参数支持

在create方法中添加可选参数args,调用parse_args时传入该参数,这样单元测试可以自定义参数,正常运行时不传则自动读取命令行参数。

2. 修正参数类型不匹配问题

要么去掉add_argument中的nargs=1(默认就是读取单个值),要么在给NamedTuple赋值时取列表的第一个元素(比如arg.device[0])。

3. 单元测试无需额外调整

修复create方法后,原测试代码的传参方式即可正常工作。

修改后的代码

AppArguments类

from typing import NamedTuple
import argparse

class AppArguments(NamedTuple):
    device_name: str
    start_date: str
    end_date: str

    @classmethod
    def create(cls, args=None):  # 添加可选参数args
        arg_parser = argparse.ArgumentParser(description="Description.")

        arg_parser.add_argument(
            '-d', '--device',
            help="Device name.",
            metavar='DEVICE_NAME',
            required=True
        )
        arg_parser.add_argument(
            '-s', '--start',
            help="Starting date.",
            metavar='YEAR-MONTH-DAY',
            required=True
        )
        arg_parser.add_argument(
            '-e', '--end',
            help="Ending date.",
            metavar='YEAR-MONTH-DAY',
            required=True
        )

        # 传入args参数,测试时用自定义参数,正常运行时自动读取命令行
        arg = arg_parser.parse_args(args)

        return cls(device_name=arg.device, start_date=arg.start, end_date=arg.end)


def main():
    arg = AppArguments.create()
    print(arg.device_name)


if __name__ == "__main__":
    main()

单元测试类

import unittest
from your_module import AppArguments  # 替换成你的模块实际名称

class AppArgumentsTestCase(unittest.TestCase):
    def test_device_with_time(self):
        # given
        arguments = AppArguments.create(['-d', 'test_device', '-s', '2022-08-11', '-e', '2022-08-12'])

        # then
        self.assertEqual('test_device', arguments.device_name)
        self.assertEqual('2022-08-11', arguments.start_date)
        self.assertEqual('2022-08-12', arguments.end_date)

验证

运行单元测试后,不会再出现TypeError报错,同时参数类型也能匹配NamedTuple的定义,测试逻辑正常执行。

内容的提问来源于stack exchange,提问作者JabWik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 14:55:26