argparse 在存在长标识符时排除短标识符
argparse excludes short identifiers when long ones are present
我正在尝试向同一个参数添加一个字符和一个关键字,这意味着我可以按值或按关键字引用,例如:python my_module.py -k abc
或 python --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.
进行自定义
我正在尝试向同一个参数添加一个字符和一个关键字,这意味着我可以按值或按关键字引用,例如:python my_module.py -k abc
或 python --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.