【问题标题】:Argparse TypeError for count-type argument when default value is provided提供默认值时计数类型参数的 Argparse TypeError
【发布时间】:2017-09-12 07:37:14
【问题描述】:

我正在为我的 Python 应用程序编写灵活的配置模块。我想允许在 Python 的命令行中覆盖配置选项。为此,我遵循使用 argparse 模块提供的 here 的想法。

不幸的是,我在某些特定用例中遇到了意外异常。请参阅以下(非常simplified)代码——我们称之为/tmp/test.py

import argparse
import configparser

# App's default settings

defaults = {
    'verbose': 3,
    'foo': 'bar'
}

# Parser for reading configuration file path (if provided)

first_parser = argparse.ArgumentParser(
    description=__doc__,
    formatter_class=argparse.RawDescriptionHelpFormatter,
    add_help=False)
first_parser.add_argument('-c', '--conf', metavar='FILE', help='Config file')
args, remaining_argv = first_parser.parse_known_args()

if args.conf:
    parser = configparser.ConfigParser()
    parser.read(args.conf)
    options = dict(parser.items('defaults'))
    defaults.update(options)

# Parser for reading app's verbosity level and value for --foo option

second_parser = argparse.ArgumentParser(parents=[first_parser], add_help=False)
second_parser.add_argument('-v', '--verbose', action='count', default=0)
second_parser.add_argument('--foo', default='xyz')
second_parser.set_defaults(**defaults)
config = second_parser.parse_args(remaining_argv)

print(config)

问题:

me@mycomp:/tmp$ python3 /tmp/test.py
Namespace(conf=None, foo='bar', verbose=3)

me@mycomp:/tmp$ python3 /tmp/test.py -v
Namespace(conf=None, foo='bar', verbose=4)

me@mycomp:/tmp$ python3 /tmp/test.py --conf /tmp/config
Namespace(conf=None, foo="aaa", verbose='6')

me@mycomp:/tmp$ python3 /tmp/test.py -v --conf /tmp/config
Traceback (most recent call last):
  File "/tmp/test.py", line 32, in <module>
    config = second_parser.parse_args(remaining_argv)
  File "/usr/lib/python3.5/argparse.py", line 1735, in parse_args
    args, argv = self.parse_known_args(args, namespace)
  File "/usr/lib/python3.5/argparse.py", line 1767, in parse_known_args
    namespace, args = self._parse_known_args(args, namespace)
  File "/usr/libPotwor/python3.5/argparse.py", line 1973, in _parse_known_args
    start_index = consume_optional(start_index)
  File "/usr/lib/python3.5/argparse.py", line 1913, in consume_optional
    take_action(action, args, option_string)
  File "/usr/lib/python3.5/argparse.py", line 1841, in take_action
    action(self, namespace, argument_values, option_string)
  File "/usr/lib/python3.5/argparse.py", line 1006, in __call__
    new_count = _ensure_value(namespace, self.dest, 0) + 1
TypeError: Can't convert 'int' object to str implicitly

/tmp/config内容:

me@mycomp:/tmp$ cat /tmp/config
[defaults]
verbose = 6
foo = aaa

这是什么原因?我该如何解决?

【问题讨论】:

  • count 操作获取默认值,加 1,然后将其放回命名空间。看起来 ConfigParser 将字符串“6”放在默认值中,如没有“-v”的配置示例所示。 "6"+1 令人窒息

标签: python arguments runtime-error command-line-arguments argparse


【解决方案1】:

我认为 options = dict(parser.items('defaults')) -> options 可以是 [('your_key', int_your_value)]。 您应该编辑:{'your_key': int}

文档:https://www.tutorialspoint.com/python/dictionary_items.htm

【讨论】:

  • 没看懂你的解释,但我猜你的意思是verbose键对应的值必须是int不是string,就像现在一样)。这是正确的。这解决了问题。 ;-)
  • 对不起。我的英语不好,所以我的解释不清楚。我正在努力改进它。
猜你喜欢
  • 2019-10-18
  • 2021-12-01
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-07
  • 2012-01-21
  • 2014-09-18
相关资源
最近更新 更多