[英]Python argparse: command-line argument that can be either named or positional
[英]Python Argparse: Get the command-line argument used for a Namespace variable
是否有適當的或至少更好的方法來獲取用於設置命名空間參數(屬性)值的命令行參數?
我目前正在使用這樣的東西:
>>> import argparse
>>>
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--do-a', '-a',
... default=False, action='store_true',
... dest='process_foo',
... help="Do some awesome a to the thing.")
>>> args = parser.parse_args()
>>>
>>> def get_argument(parser, dest):
... for action in parser._actions:
... if action.dest == dest:
... return action.option_strings[0], action.help
... return dest, ''
...
>>> get_argument(parser, 'process_foo')
('--do-a', 'Do some awesome a to the thing.')
這可能適用於 99% 的情況; 但是,如果有多個命令行參數可以設置process_foo
,這將不起作用,並且訪問“隱藏”實例屬性( parser._actions
) parser._actions
。 有一個更好的方法嗎?
我將這個添加到一個模塊中,所有數據科學過程都繼承了哪些日志環境和其他東西,以便我們有更好的可重復性。 有問題的模塊已經自動記錄設置、參數、命令行參數等,但在某些方面不是很用戶友好。
不要擔心的“隱藏性” _actions
。 這是存儲對add_argument
創建的所有Actions
引用的主要列表。 您不應該擺弄列表,但您當然可以使用它來收集信息。
add_argument
創建一個Action
對象,將其放入_actions
(通過_add_action
方法),並返回它。 如果你不喜歡使用_actions
你可以收集自己的參考表,使用返回的對象add_argument
。
我從_add_action
看到它還將標記的動作放在self._option_string_actions
字典中,從而更容易將選項字符串與其action
配對。
解析不會對parser
、其屬性或actions
進行任何更改。 雖然它有各種局部變量(在_parse_known_args
方法中),但唯一改變的是args
命名空間。
它使用getattr
、 setattr
和hasattr
盡可能保持對args
的訪問。 這包括在解析開始時設置默認值。 解析器不維護哪個選項字符串觸發特定take_action
和后續setattr
。 然而, Action
的__call__
確實得到了字符串。 對於最常見的“store_action”調用是
def __call__(self, parser, namespace, values, option_string=None):
setattr(namespace, self.dest, values)
我認為所有定義的Action
子類都使用self.dest
,但用戶定義的則不必。 他們甚至可以設置其他名稱空間屬性,或者不設置(例如 help 不設置任何內容)。 他們還可以記錄option_string
。
我建議創建你自己的從argarse.Action派生的動作類,它不僅將解析的值存儲在命名空間中,而且還將解析值的選項字符串存儲在命名空間中。
import argparse
class StoreTrueWithOptionStringAction(argparse.Action):
def __init__(self,
option_strings,
dest,
const,
default=None,
required=False,
help=None,
metavar=None):
super().__init__(option_strings=option_strings,
dest=dest,
nargs=0,
const=const,
default=default,
required=required,
help=help)
def __call__(self, parser, namespace, values, option_string=None):
setattr(namespace, self.dest, self.const)
if option_string is not None:
setattr(namespace, f'{self.dest}_option_string', self.option_string)
如果您使用該自定義操作,則可以像這樣訪問它。
...
args = parser.parse_args()
args.process_foo # returns True
args.process_foo_option_string # returns "--do-a"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.