<p>注意,我认为您需要使用<em>位置</em>argparse参数来重复它们(即,您没有存储选项名称)。或者,也许我对OptPass感到困惑,因为我现在主要使用Click</p>
<p>文档的<a href="https://docs.python.org/3/library/argparse.html#nargs" rel="nofollow noreferrer">nargs</a>部分涵盖了这一点,因此看起来您也可以使用<code> store</code>。没有非常清楚的例子。也就是说,对于用户来说,这需要更多的输入,所以我会选择位置</p>
<pre><code>import argparse
#the existing dictionary
lookup = {'store1': 'checkpoint_store1', 'store2': 'checkpoint_store2','store3': 'checkpoint_store3'}
#from doc @ https://docs.python.org/3/library/argparse.html#example
parser = argparse.ArgumentParser(description='Process some stores.')
#Option 1 your loop checks for valid stores
# parser.add_argument('stores', type=str, nargs='+', help='stores')
#Option2 argparse checks for valid stores
parser.add_argument('stores', type=str, nargs='+', help='stores', choices=lookup.keys())
args = parser.parse_args()
user_stores = args.stores
dict_stores = {}
#check in loop
for store in user_stores:
try:
dict_stores[store] = lookup[store]
#pragma: no cover pylint: disable=unused-variable
except (KeyError,) as e:
print(f" unknown store {store}. known : {' '.join(lookup.keys())}")
# if you use argparse to check this can be simplified to
# dict_stores[store] = {store: lookup[store] for store in user_stores}
print(f"{dict_stores}")
</code></pre>
<h3>输出:</h3>
<pre><code>(venv38) me@explore$ py test_301_arg.py store1 store2
{'store1': 'checkpoint_store1', 'store2': 'checkpoint_store2'}
(venv38) me@explore$ py test_301_arg.py store1 store4
usage: test_301_arg.py [-h] {store1,store2,store3} [{store1,store2,store3} ...]
test_301_arg.py: error: argument stores: invalid choice: 'store4' (choose from 'store1', 'store2', 'store3')
(venv38) me@explore$ py test_301_arg.py help
usage: test_301_arg.py [-h] {store1,store2,store3} [{store1,store2,store3} ...]
Process some stores.
positional arguments:
{store1,store2,store3}
stores
optional arguments:
-h, help show this help message and exit
</code></pre>