簡體   English   中英

Python argparse-具有'store_true'行為的用戶定義操作

[英]Python argparse - user defined Action with 'store_true' behavoiur

嗨,我想我有無法傳遞任何值的解析器參數,例如:

parser.add_argument('-s', '--staged', action=FooAction)

而我的用戶定義動作:

class FooAction(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        print("action")

當我嘗試不帶任何值調用此方法時:

python my_script -s

我收到此錯誤消息:

test.py: error: argument -s/--staged: expected one argument

我知道我可以將操作'store_true'添加到我的參數中,但是在這種解決方案中,我無法將此參數的執行重定向到我定義的操作類中。

有人知道如何修改FooAction來實現'store_true'行為嗎?

編輯

設置nargs = 0的Fooaction類:

class FooAction(argparse.Action):
    def __init__(self, option_strings, dest, nargs=0, **kwargs):
        super(FooAction, self).__init__(option_strings, dest, nargs, **kwargs)
    def __call__(self, parser, namespace, values, option_string=None):
        print("action")
import argparse

class FooAction(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        print("action")
        print(self)
        print(parser, namespace, values, option_string)

parser = argparse.ArgumentParser()
parser.add_argument('-s', '--staged', action=FooAction, nargs=0)
args = parser.parse_args()
print(args)

樣品運行:

1151:~/mypy$ python3 stack56348020.py -s
action
FooAction(option_strings=['-s', '--staged'], dest='staged', nargs=0, const=None, default=None, type=None, choices=None, help=None, metavar=None)
ArgumentParser(prog='stack56348020.py', usage=None, description=None, formatter_class=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=True) Namespace(staged=None) [] -s
Namespace(staged=None)

使用你的init

import argparse

class FooAction(argparse.Action):
    def __init__(self, option_strings, dest, nargs=0, **kwargs):
        super(FooAction, self).__init__(option_strings, dest, nargs=nargs, **kwargs)
    def __call__(self, parser, namespace, values, option_string=None):
        print("action")
        print(parser, namespace, values, option_string)

parser = argparse.ArgumentParser()
a1 = parser.add_argument('-s', '--staged', action=FooAction)
print(a1)   # display the action object and most of its parameters
args = parser.parse_args()
print(args)

1208:~/mypy$ python3 stack56348020.py -s
FooAction(option_strings=['-s', '--staged'], dest='staged', nargs=0, const=None, default=None, type=None, choices=None, help=None, metavar=None)
action
ArgumentParser(prog='stack56348020.py', usage=None, description=None, formatter_class=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=True) Namespace(staged=None) [] -s
Namespace(staged=None)

add_argument返回它創建的Action對象。 我們通常會忽略它,將其保存到參考中,並在調試過程中方便打印。

即使Action子類被標記為“ private”(帶有_ ),查看它們的代碼以查看如何自定義基類也是一個好主意。 Action類本身並不能做什么。 默認操作使用_StoreAction 存儲True / False子類_StoreConst _HelpAction是唯一不在namespace存儲某種值的函數; 並退出系統。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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