内部
def parse_args():
我有一些subparser,我通常直接调用函数
.set_defaults(func=SOMEFUNCTION)
但我有一个
class Something(object):
如何访问该类然后调用该函数?我试图实现这一点,而不是在主
下拥有所有add_arguments()答案 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(...)