【问题标题】:Default value of commandline parameters when no value is provided [duplicate]未提供值时命令行参数的默认值[重复]
【发布时间】:2014-08-07 23:06:11
【问题描述】:

我正在使用 ArgParse 在 Python 中提供命令行参数。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--quality", type=int,help="enter some quality limit")
args = parser.parse_args()
qual=args.quality

if args.quality:
  qual=0

$ python a.py --quality 

a.py: error: argument --quality: expected one argument

如果没有提供值,我想将其用作 0,我也尝试在 parser.add_argument 中将其设置为“default=0”,并使用 if 语句。但是,我得到了上面的错误.

基本上,我想将其用作标志并在未提供值的情况下提供默认值。

【问题讨论】:

    标签: python command-line-arguments argparse


    【解决方案1】:

    使用nargs='?' 允许--quality 与提供的0 或1 值一起使用。使用 const=0 处理 script.py --quality 而不提供值。使用default=0 处理对script.py 的裸调用(不提供--quality)。

    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument("--quality", type=int, help="enter some quality limit",
                        nargs='?', default=0, const=0)
    args = parser.parse_args()
    print(args)
    

    行为如下:

    % script.py 
    Namespace(quality=0)
    % script.py --quality
    Namespace(quality=0)
    % script.py --quality 1
    Namespace(quality=1)
    

    【讨论】:

      【解决方案2】:

      https://docs.python.org/2/howto/argparse.html#id1 获得战利品。只需将参数 default 添加到您的 add_argument 调用中。

      parser.add_argument("--quality", type=int, default=0, nargs='?', help="enter some quality limit")

      如果您想使用--quality 作为标志,您应该使用action="store_true"。如果使用了--quality,这会将args.quality 设置为True

      【讨论】:

        【解决方案3】:

        docopt 在文档字符串中使用 [default: 0]

        故意忽略您问题的argparse 部分,这里是您如何使用docopt 定义默认值。

        使用docopt,您可以将默认值(以及几乎所有其他值)定义为文档字符串的一部分。

        首先,安装docopt 并用于验证值schema

        $ pip install docopt schema
        

        然后编写脚本a.py:

        """
        Usage:
            a.py [--quality <qlimit>]
            a.py -h
        
        Options:
            --quality=<qlimit>  Quality limit [default: 0]
        """
        def main(quality):
            print "FROM MAIN: minimal quality was set to", quality
        
        if __name__ == "__main__":
            from docopt import docopt
            from schema import Schema, And, Use, SchemaError
            args = docopt(__doc__)
            print args
            schema = Schema({
                "--quality": 
                And(Use(int), lambda n: 0 <= n, error="<qlimit> must be non-negative integer"),
                "-h": bool
            })
            try:
                args = schema.validate(args)
            except SchemaError as e:
                exit(e)
            quality = args["--quality"]
            main(quality)
        

        并使用脚本,首先请求帮助字符串:

        $ python a.py -h
        Usage:
            a.py [--quality <qlimit>]
            a.py -h
        
        Options:
            --quality=<qlimit>  Quality limit [default: 0]
        

        然后使用默认值:

        $ python a.py
        {'--quality': '0',
         '-h': False}
        FROM MAIN: minimal quality was set to 0
        

        将非默认正确的 1 设置为 5:

        $ python a.py --quality 5
        {'--quality': '5',
         '-h': False}
        FROM MAIN: minimal quality was set to 5
        

        尝试不允许的负值:

        $ python a.py --quality -99
        {'--quality': '-99',
         '-h': False}
        <qlimit> must be non-negative integer
        

        或非整数一:

        $ python a.py --quality poor
        {'--quality': 'poor',
         '-h': False}
        <qlimit> must be non-negative integer
        

        注意,一旦validate 步骤通过,“--quality”键的值就已经转换为int

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-16
          • 2023-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-12
          • 2022-01-12
          相关资源
          最近更新 更多