argparse 在存在长标识符时排除短标识符

argparse excludes short identifiers when long ones are present

我正在尝试向同一个参数添加一个字符和一个关键字,这意味着我可以按值或按关键字引用,例如:python my_module.py -k abcpython --keyword abc 我期待两者都可以工作,但是当我添加名称并调用 args.k 时,出现命名空间错误。我在这里查找并发现了关于相同错误的问题,但 none 正在回答我的问题。

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')

POSIX 约定允许参数以简洁的单破折号和单个字母的形式传递,或者以冗长的双破折号和冗长的名称形式传递。特别是对于布尔标志,这使得命令更快更短:

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

这些命令完全相同,但是一旦您记住 shorthand.

,输入第一个命令会快得多

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

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

Argparse 使用详细名称作为参数的规范名称。您可以使用 the dest argument.

进行自定义