tom*_*sen 14 python argparse python-3.x
如果我使用以下选项调用下面的脚本:
--user u1 --password p1 --foo f1 --user u2 --user u3 --password p3
Run Code Online (Sandbox Code Playgroud)
然后它将打印:
Namespace(foo=['bar', 'f1'], password=['p1', 'p3'], user=['u1', 'u2', 'u3'])
Run Code Online (Sandbox Code Playgroud)
问题:我有没有办法在用户和密码之间建立依赖关系,因此会抛出错误,因为没有指定用户u2的密码?
不太相关的问题:如何为所有用户指定默认的foo值?对于给定的输入,我希望foo等于['f1','bar','bar'].
我的主要问题的解决方案是检查列表用户和密码是否具有相同的长度,但它不是我正在寻找的.
这是脚本:
import argparse
parser = argparse.ArgumentParser()
group = parser.add_argument_group('authentication')
group.add_argument('--user', action='append', required=True)
group.add_argument('--password', action='append', required=True)
group.add_argument('--foo', action='append', default=['bar'])
print(parser.parse_args())
Run Code Online (Sandbox Code Playgroud)
Bak*_*riu 12
在您的情况下,由于选项必须始终一起指定,或者不能同时指定,您可以将它们连接到一个--user-and-password带有两个参数的唯一选项nargs=2.这将简化很多值的处理.
事实上,您希望能够提供多对,但是required=True在找到第一个选项时会感到满意,因此在您的设置中检查您想要的内容几乎没用.
另一种方法是使用自定义操作.例如:
import argparse
class UserAction(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
if len(namespace.passwords) < len(namespace.users):
parser.error('Missing password')
else:
namespace.users.append(values)
class PasswordAction(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
if len(namespace.users) <= len(namespace.passwords):
parser.error('Missing user')
else:
namespace.passwords.append(values)
parser = argparse.ArgumentParser()
parser.add_argument('--password', dest='passwords', default=[], action=PasswordAction, required=True)
parser.add_argument('--user', dest='users', default=[], action=UserAction, required=True)
print(parser.parse_args())
Run Code Online (Sandbox Code Playgroud)
用作:
$python3 ./test_argparse.py --user 1 --password 2 --password 2 --user 3 --password 3
usage: test_argparse.py [-h] --password PASSWORDS --user USERS
test_argparse.py: error: Missing user
Run Code Online (Sandbox Code Playgroud)
和:
$python3 ./test_argparse.py --user 1 --password 2 --user 2 --user 3 --password 3
usage: test_argparse.py [-h] --password PASSWORDS --user USERS
test_argparse.py: error: Missing password
Run Code Online (Sandbox Code Playgroud)
(请注意,此解决方案需要--user在此之前--password,否则列表的长度不足以提供有关何时缺少选项的信息.)
最后一个解决方案是简单地使用action='append'和测试最终的值列表.然而,这将允许--user A --user B --password A --password B您想要允许或不可能的事情.