有没有办法从subparser中调用一个类?

时间:2016-07-12 00:49:24

标签: python argparse

内部

def parse_args(): 

我有一些subparser,我通常直接调用函数

.set_defaults(func=SOMEFUNCTION) 

但我有一个

class Something(object):

如何访问该类然后调用该函数?我试图实现这一点,而不是在

下拥有所有add_arguments()

1 个答案:

答案 0 :(得分:0)

我猜测你的需求很多

但你正在做类似的事情:

subparser.set_defaults(func=SOMEFUNCTION) 

以后

args = parser.parse_args()
args.func(args)       # call the function

在其余的args(或其他一些值)上运行SOMEFUNCTION。 subparser不运行你的函数,它只是将该对象放入命名空间。解析后调用它。

如果SOMEFUNCTION是一个类的方法,您可以执行类似

的操作
(func = Something(...).some_method)

要做的重点

subparse.set_defaults(func=...)

是将args命名空间中的属性设置为在使用该子解析器时有用的属性。它不一定是一个函数,它甚至不必是一个可调用的函数。它可以是一个字符串,它可以是几个值,它可以是这个类的一个实例。它可能是班级。

subparser.set_defaults(class=SetterUpper)
...
obj = args.class()
obj.dostuff()

如果在解析过程中你要求这个subparser,主解析器会将操作传递给subparse。换句话说,subparse.parse_args(strings, namespace)。然后subparse将其默认值添加到namespace,并解析stings。所以set_defaults所做的就是在使用这个特殊的subparse时将它的参数添加到命名空间。而已。现在,您可以在namespace中添加一个或添加的属性,您可以按照自己的方式使用。

您可以使用subparsers执行的另一项操作是指定dest参数

subparsers = parser.add_subparsers(dest='cmd')

然后args.cmd将是您调用的subparser的名称,例如adduser。然后就可以了

if args.cmd in ['adduser']:
    # perform the actions related to `adduser`
    obj = Something(...) # make instance
    obj.mymethod(...)    # run a method of this instance

如果在解析之前无法创建实例或函数,则可能必须使用此方法而不是set_defaults

或者可以定义SOMEFUNCTION来创建所需的实例。

def SOMEFUNCTION(args):
    obj = Something(args)
    obj.mymethod(...)