Having options in argparse with a dash

前端 未结 5 1435
长发绾君心
长发绾君心 2020-12-12 18:58

I want to have some options in argparse module such as --pm-export however when I try to use it like args.pm-export I get the error that there is n

相关标签:
5条回答
  • 2020-12-12 19:05

    Unfortunately, dash-to-underscore replacement doesn't work for positionalarguments (not prefixed by --) like

    parser = argparse.ArgumentParser(description='Process some integers.')
    parser.add_argument('logs-dir',
                        help='Directory with .log and .log.gz files')
    parser.add_argument('results-csv', type=argparse.FileType('w'),
                        default=sys.stdout,
                        help='Output .csv filename')
    args = parser.parse_args()
    print args
    
    # gives
    # Namespace(logs-dir='./', results-csv=<open file 'lool.csv', mode 'w' at 0x9020650>)
    

    So, you should use 1'st argument to add_argument() as attribute name and metavar kwarg to set how it should look in help:

    parser = argparse.ArgumentParser(description='Process some integers.')
    parser.add_argument('logs_dir', metavar='logs-dir',
                        nargs=1,
                        help='Directory with .log and .log.gz files')
    parser.add_argument('results_csv', metavar='results-csv',
                        nargs=1,
                        type=argparse.FileType('w'),
                        default=sys.stdout,
                        help='Output .csv filename')
    args = parser.parse_args()
    print args
    
    # gives
    # Namespace(logs_dir=['./'], results_csv=[<open file 'lool.csv', mode 'w' at 0xb71385f8>])
    
    0 讨论(0)
  • 2020-12-12 19:13

    Dashes are converted to underscores:

    import argparse
    pa = argparse.ArgumentParser()
    pa.add_argument('--foo-bar')
    args = pa.parse_args(['--foo-bar', '24'])
    print args # Namespace(foo_bar='24')
    
    0 讨论(0)
  • 2020-12-12 19:13

    getattr(args, 'positional-arg')

    This is another OK workaround for positional arguments:

    #!/usr/bin/env python3
    
    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument('a-b')
    args = parser.parse_args(['123'])
    assert getattr(args, 'a-b') == '123'
    

    Tested on Python 3.8.2.

    0 讨论(0)
  • 2020-12-12 19:17

    Concise and explicit but probably not always acceptable way would be to use vars():

    #!/usr/bin/env python3
    
    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument('a-b')
    args = vars(parser.parse_args())
    
    print(args['a-b'])
    
    0 讨论(0)
  • 2020-12-12 19:21

    As indicated in the argparse docs:

    For optional argument actions, the value of dest is normally inferred from the option strings. ArgumentParser generates the value of dest by taking the first long option string and stripping away the initial -- string. Any internal - characters will be converted to _ characters to make sure the string is a valid attribute name

    So you should be using args.pm_export.

    0 讨论(0)
提交回复
热议问题