在argparser中访问传递给参数的选项?

时间:2016-09-12 23:19:12

标签: python argparse

是否可以访问传递给参数的选项元组?如果是这样,我该怎么做呢

例如,如果我有

parser = argparse.ArgumentParser(description='choose location')
parser.add_argument(
    "--location",
    choices=('here', 'there', 'anywhere')
)
args = parser.parse_args()

我可以访问元组('here', 'there', 'anywhere')吗?

3 个答案:

答案 0 :(得分:7)

事实证明,parser.add_argument实际上会返回关联的Action。您可以选择以下选项:

>>> import argparse
>>> parser = argparse.ArgumentParser(description='choose location')
>>> action = parser.add_argument(
...     "--location",
...     choices=('here', 'there', 'anywhere')
... )
>>> action.choices
('here', 'there', 'anywhere')

请注意,(AFAIK)此处未在任何地方记录,可能被视为“实施细节”,因此如有更改,恕不另行通知等。

在添加ArgumentParser之后,还没有任何公开可访问的方式来获取存储在parser._actions上的操作。我相信如果您愿意了解实施细节(并假设涉及任何风险),它们可以LOCATION_CHOICES = ('here', 'there', 'anywhere') parser = argparse.ArgumentParser(description='choose location') parser.add_argument( "--location", choices=LOCATION_CHOICES ) args = parser.parse_args() # Use LOCATION_CHOICES down here... 获得......

你最好的选择是为位置选择创建一个常量,然后在你的代码中使用它:

<script type="text/javascript">
function toggleImages(obj) {
if(obj.style.backgroundImage == 'url("images/none.jpg")') {
    obj.style.backgroundImage = 'url("images/iPhoneImage-300x300.jpg")';
}
else if(obj.style.backgroundImage == 'url("images/iPhoneImage-300x300.jpg")'){
    obj.style.backgroundImage = 'url("images/smartphoneImage-300x300.jpg")';
}
else if(obj.style.backgroundImage == 'url("images/smartphoneImage-300x300.jpg")'){
obj.style.backgroundImage = 'url("images/none.jpg")';
}
}

 </script>

<div onclick="toggleImages(this);" id="arrow1" style="background-image:url(images/none.jpg); display:block; width:300px; height:300px"></div> 

答案 1 :(得分:2)

可能有更好的方法,但我在文档中看不到任何内容。如果你知道解析器选项,你应该能够做到:

parser = argparse.ArgumentParser()
parser.add_argument("--location", choices=("here", "there", "everywhere"))

storeaction = next(a for a in parser._actions if "--location" in a.option_strings)

storeaction.choices
# ('here', 'there', 'everywhere')

正如在mgilson的回答中一样,访问_actions属性没有记录,强调的前缀意味着&#34;嘿,你可能不应该惹我生气。&#34;如果在Python版本之间中断,请不要感到惊讶。

答案 2 :(得分:1)

关于add_argument返回的问题,如果您在ipython这样的互动会话中进行任何测试,那么回报会让您盯着:

In [73]: import argparse
In [74]: parser=argparse.ArgumentParser()
In [75]: parser.add_argument('foo',choices=['one','two','three'])
Out[75]: _StoreAction(option_strings=[], dest='foo', nargs=None, const=None, default=None, type=None, choices=['one', 'two', 'three'], help=None, metavar=None)
In [76]: _.choices
Out[76]: ['one', 'two', 'three']

请注意,add_argument_groupadd_subparsersadd_parseradd_mutually_exclusive_group等其他方法都会返回可以使用的对象。我认为add_argument没有记录为返回对象的事实是文档疏忽。通常用户不需要使用它,但作为半开发人员,我一直都在使用它。 argparse的文档不是模块可以或不可以做的正式规范;它更像是一本指导手册,从教程中提升,但显然不是参考。

使用parser._actions非常方便,但更深入了解内心。我已经跟踪了几乎所有的错误/问题,并且无法想到任何会引发变化的问题。由于存在对后向兼容性问题的担忧,开发人员已经减少到近乎不动的状态。更改文档比更改argparse的功能更容易。