簡體   English   中英

Python Argparse:獲取用於命名空間變量的命令行參數

[英]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._actionsparser._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命名空間。

它使用getattrsetattrhasattr盡可能保持對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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM