34

デフォルトの名前とパスワードを使用するプログラムがあります。argparseを使用して、ユーザーがコマンドラインオプションを指定できるようにしています。ユーザーが使用する別の名前とパスワードをプログラムに提供できるようにしたいと思います。だから私は次のことをしています:

parser.add_argument(
    '-n',
    '--name',
    help='the login name that you wish the program to use'
    )

parser.add_argument(
    '-p',
    '--password',
    help='the password to log in with.'
    )

ただし、名前のみまたはパスワードのみを指定することは意味がありませんが、どちらも指定することは意味がありません。argparseには、2つの引数が相互に排他的であることを指定する機能があることに気づきました。しかし、私が持っているのは、一緒に現れなければならない2つの議論です。この動作を取得するにはどうすればよいですか?(ドキュメントに記載されている「引数グループ」を見つけましたが、問題を解決していないようですhttp://docs.python.org/2/library/argparse.html#argument-groups

4

3 に答える 3

25

これを処理する最善の方法は、返された名前空間を後処理することだと思います。argparseこれをサポートしない理由は、引数1を一度に解析するためです。argparse何かがすでに解析されているかどうかを確認するのは簡単ですが(これが相互に排他的な引数が機能する理由です)、将来何かが解析されるかどうかを確認するのは簡単ではありません。

シンプルな:

parser.add_argument('-n','--name',...,default=None)
parser.add_argument('-p','--password',...,default=None)
ns = parser.parse_args()

if len([x for x in (ns.name,ns.password) if x is not None]) == 1:
   parser.error('--name and --password must be given together')

name = ns.name if ns.name is not None else "default_name"
password = ns.password if ns.password is not None else "default_password"

それで十分なようです。

于 2013-01-16T02:21:27.543 に答える
22

私はこれが2年以上遅れていることを知っていますが、私はそれを行うための素晴らしく簡潔な方法を見つけました:

if bool(ns.username) ^ bool(ns.password):
    parser.error('--username and --password must be given together')

^PythonのXOR演算子です。コマンドラインで指定された両方の引数を要求することは、本質的にXORテストです。

于 2015-10-07T17:11:41.587 に答える
8

これはおそらく私がそれをする方法です。変更するオプションを備えた既存のデフォルトがあるため、デフォルトを定義しますが、引数のデフォルトとして使用しないでください。

default_name = "x"
default_pass = "y"
parser.add_argument(
    '-n',
    '--name',
    default=None,
    help='the login name that you wish the program to use'
    )

parser.add_argument(
    '-p',
    '--password',
    default=None,
    help='the password to log in with.'
    )
args = parser.parse_args()
if all(i is not None for i in [args.name, args.password]):
    name = args.name
    passwd = args.password
elif any(i is not None for i in [args.name, args.password]):
    parser.error("Both Name and Password are Required!")
else:
    name = default_name
    passwd = default_pass
于 2013-01-16T02:26:13.473 に答える