2017-10-15 59 views
0

我对Python OOP很新,所以我有些困惑。如何将argparse选项包装到python类中?

目前我有:

parser = argparse.ArgumentParser(description='script 1.0') 
parser.add_argument('-a', '--foo', help='specify foo') 
parser.add_argument('-b', '--bar', type=int, help='specify bar') 
parser.add_argument('-c', '--baz', help='specify baz') 
parser.add_argument('-d', '--bar2', help='bar2') 

args = parser.parse_args() 

foo = args.foo 
bar = args.bar 
baz = args.baz 
bar2 = args.bar2 

它工作得很好,但我想新建一个类为整个我的脚本,使argparse作为一个类的方法(有没有可能呢?)。

所以,我想:

 import argparse 
     .... 

     Class Program: 
      def __init__(self, foo, bar, baz, bar2): 
       self.foo = foo 
       self.bar = bar 
       ...(so on for each arg) 
      def main(): 
       parser = argparse.ArgumentParser(description='script 1.0') 
       parser.add_argument('-a', '--foo', help='specify foo') 
       parser.add_argument('-b', '--bar', type=int, help='specify bar') 
       parser.add_argument('-c', '--baz', help='specify baz') 
       parser.add_argument('-d', '--bar2', help='bar2') 

       args = parser.parse_args() 

       foo = self.foo 
       bar = self.bar 
       baz = self.baz 
       bar2 = self.bar2 

我不认为我做得对,虽然。我还没有找到太多的信息,但是对于SO没有任何明确说明情况的帖子,所以我想对我的具体情况有意见。

+0

你似乎在正确的轨道上,你实际面临什么问题? – ZdaR

+0

@ZdaR,argparse选项没有被记住的进一步的用法,我是关于,我不应该像这样intianalize类: __init __(self, - foo, - bar,--baz,--bar2) –

+2

我认为最好有明确的关注点分离。换句话说,将您的CLI输入与业务逻辑(程序类)分开。要做到这一点,我只会在脚本直接执行时使用argparse。换句话说,在'if __name__ == __main__'部分下。那么一旦argparse完成了它的工作,创建一个将解析的参数传递给它的类实例,并运行你的逻辑。 – monkut

回答

1

​​已经在使用类。 argparse.ArgumentParser(...)创建一个解析器对象。 parser.add_argument(...)创建Action对象,并将其放入parser列表中。它还会将它返回给您的代码,这可能在某些高级应用中非常方便。 parse_args()返回一个argparse.Namespace对象。

您可以继承​​类以定制其性能。

但通常你不需要创建你自己的parser类 - 除非你需要很多特殊的行为。

这里就是我认为的清洁利用​​:

import argparse 

# your code 
def main(args): 
    foo = args.foo 
    # other uses of args 

def other(foo, bar): 
    # code using values 

def make_parser(): 
    parser = argparse.ArgumentParser(description='script 1.0') 
    parser.add_argument('-a', '--foo', help='specify foo') 
    parser.add_argument('-b', '--bar', type=int, help='specify bar') 
    parser.add_argument('-c', '--baz', help='specify baz') 
    parser.add_argument('-d', '--bar2', help='bar2') 
    return parser 

if __name__ == '__main__': 
    parser = make_parser() 
    args = parser.parse_args() 

结束语在函数解析器定义是一个好主意。在更复杂的情况下,它可能是一个班级。但通常每个脚本只需要一个解析器,所以一个函数就足够了。该函数可以在脚本的主体中,但实际使用应该在if __name__块中,因此可以在不使用解析器的情况下导入脚本。

这会将args命名空间置于全局环境中,其中所有代码均可访问。它可以为你的函数传递,或者选择的值可以传递:

main(args) 
other(args.foo, args.bar) 
foo = args.foo 
do_things3(foo) 
d = vars(args) # args in dictionary form 

这是写你的代码,以便它可以作为进口类和/或功能,当作为一个脚本运行一个好主意。作为脚本运行时,​​部分设置值。导入时,导入脚本会设置必要的控制值,可能会使用它自己的parser

相关问题