ArgumentParser.add_argument: 如何使用带有自定义类型参数的动作参数?
ArgumentParser.add_argument: How to use action parameter with custom type parameter?
当我尝试做什么问题是关于使用:
parser.add_argument("--blah", type=func, help="Whatever", action='store_true')
...我收到此错误:
TypeError: __init__() got an unexpected keyword argument 'type'
当在命令行上使用此标志时,我真正想要的是 运行 一个名为 func 的函数(指定为上面的参数类型):
python3 script.py --blah
这有可能吗?如果我需要更详细地回答我的问题,请告诉我。
您可以在解析参数后调用您的函数
parser.add_argument("--blah", help="Whatever", action='store_true')
args = parser.parse_args()
然后检查标志值并适当地调用函数
if args.blah:
func()
这是一种方法:
from argparse import Action
class CleanUpAction(Action):
'''
@summary: Clean up the arguments
'''
def __call__(self, parser, args, values, option_string=None):
if values.startswith('\'') and values.endswith('\''):
values = values[1:-1]
setattr(args, self.dest, values)
parser.add_argument('-blah', '--blah', type=str, action=CleanUpAction, help='clean up the argument')
这样它会在清理执行后存储
import argparse
def func():
pass
def main(args):
############### Parsed command line arguments to initialize variables ######################
blah = args.blah
if blah:
func()
def get_parser():
### Command line input parsing here. ###########
parser = argparse.ArgumentParser(prog='python ' + sys.argv[0], description='This program does blah!')
parser.add_argument("-blah", , help='Run func',default= False, action='store_true')
if __name__ == "__main__":
parser = get_parser()
args = parser.parse_args()
type
参数是一个测试函数 and/or 将命令行参数转换为将存储在 args
命名空间中的内容。
parser.parse_args('--foo', type=int) # default store action
会将 ['--foo','123']
转换为 Namespace(foo=123)
,而不是 foo='123'
。
但是 action='store_true'
创建了一个 True/False 参数。标志后不需要参数。所以给它一个type
参数是没有意义的。诚然,错误信息可能更清楚,但这种错误并不经常出现。这是一个开发问题,而不是 运行一次。
正如其他人所指出的,您可以使用 args.blah
的 True/False
值在解析后有条件地 运行 您的 func
。
你希望 func
什么时候成为 运行?在解析了所有命令行之后?或者还在解析的时候?我更喜欢将解析与 运行ning 分开。使用 argparse
来弄清楚你的用户想要什么;使用您自己的代码执行之后的操作。
当我尝试做什么问题是关于使用:
parser.add_argument("--blah", type=func, help="Whatever", action='store_true')
...我收到此错误:
TypeError: __init__() got an unexpected keyword argument 'type'
当在命令行上使用此标志时,我真正想要的是 运行 一个名为 func 的函数(指定为上面的参数类型):
python3 script.py --blah
这有可能吗?如果我需要更详细地回答我的问题,请告诉我。
您可以在解析参数后调用您的函数
parser.add_argument("--blah", help="Whatever", action='store_true')
args = parser.parse_args()
然后检查标志值并适当地调用函数
if args.blah:
func()
这是一种方法:
from argparse import Action
class CleanUpAction(Action):
'''
@summary: Clean up the arguments
'''
def __call__(self, parser, args, values, option_string=None):
if values.startswith('\'') and values.endswith('\''):
values = values[1:-1]
setattr(args, self.dest, values)
parser.add_argument('-blah', '--blah', type=str, action=CleanUpAction, help='clean up the argument')
这样它会在清理执行后存储
import argparse
def func():
pass
def main(args):
############### Parsed command line arguments to initialize variables ######################
blah = args.blah
if blah:
func()
def get_parser():
### Command line input parsing here. ###########
parser = argparse.ArgumentParser(prog='python ' + sys.argv[0], description='This program does blah!')
parser.add_argument("-blah", , help='Run func',default= False, action='store_true')
if __name__ == "__main__":
parser = get_parser()
args = parser.parse_args()
type
参数是一个测试函数 and/or 将命令行参数转换为将存储在 args
命名空间中的内容。
parser.parse_args('--foo', type=int) # default store action
会将 ['--foo','123']
转换为 Namespace(foo=123)
,而不是 foo='123'
。
但是 action='store_true'
创建了一个 True/False 参数。标志后不需要参数。所以给它一个type
参数是没有意义的。诚然,错误信息可能更清楚,但这种错误并不经常出现。这是一个开发问题,而不是 运行一次。
正如其他人所指出的,您可以使用 args.blah
的 True/False
值在解析后有条件地 运行 您的 func
。
你希望 func
什么时候成为 运行?在解析了所有命令行之后?或者还在解析的时候?我更喜欢将解析与 运行ning 分开。使用 argparse
来弄清楚你的用户想要什么;使用您自己的代码执行之后的操作。