首页 > 解决方案 > 当存在长标识符时,argparse 会排除短标识符

问题描述

我正在尝试向同一个参数添加一个字符和一个关键字,这意味着我可以按值或关键字引用,例如:python my_module.py -k abc或者python --keyword abc我希望两者都能工作但是当我添加一个名称并调用时args.k我得到一个命名空间错误。我查了一下here,发现一些问题都在问同样的错误,但没有人回答我的问题。

def main(argv):
    parser = argparse.ArgumentParser()
    parser.add_argument('-w', '--website',
                        help='Website that returns ip address as response content',
                        default='http://icanhazip.com')
    parser.add_argument('-f', '--file',
                        help='File containing raw proxies delimited by \n',
                        default='proxy_urls.txt')
    parser.add_argument('-t', '--timeout', help='Request timeout', default=10, type=int)
    parser.add_argument('-s', '--socks', help='4 or 5 for SOCKS version', default='')
    parser.add_argument('-j', '--jobs', help='Number of parallel jobs', default=4, type=int)
    parser.add_argument('-o', '--output', help='Output destination', default='.')
    args = parser.parse_args(argv)
    tester = ProxyTester(args.f, args.w, args.t, args.s)
    tester.test_proxies(args.j, args.o)


if __name__ == '__main__':
    main(sys.argv[1:])

在:

>> python3 proxy_tester.py

出去:

Traceback (most recent call last):
  File "proxy_tester.py", line 152, in <module>
    main(sys.argv[1:])
  File "proxy_tester.py", line 147, in main
    tester = ProxyTester(args.f, args.w, args.t, args.s)
AttributeError: 'Namespace' object has no attribute 'f'

这是输出print(args)

Namespace(file='proxy_urls.txt', jobs=4, output='.', socks='', timeout=10, website='http://icanhazip.com')

标签: pythonpython-3.xcommand-line-argumentsargparse

解决方案


POSIX 约定允许参数以简洁的单破折号和单字母形式传递,或者以双破折号和详细名称的形式传递。尤其是使用布尔标志,这使得命令更快更短:

curl -LIv
curl -L -I -v
curl --location --head --verbose

这些命令都是完全等价的,但是一旦你记住了速记,第一个命令会更快键入。

在您的 Python 代码中,您显然希望将其标准化为一个参数。你不想做:

if args.L or args.location: ...

Argparse 使用详细名称作为参数的规范名称。您可以使用参数自定义dest


推荐阅读