2017-10-15 53 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

相關問題