2016-01-07 63 views
2

我有一組標誌(4標誌),它們控制我的python腳本生成的輸出的性質,以及控制腳本向終端輸出多少信息的標誌(方式一般是verbose標誌)。這些標誌被多個函數使用。標誌的值由可選的命令行參數設置,我使用​​解析。在Python中使用命令行參數標誌的正確方法

目前我在全局範圍內使用這些標誌之外的任何使用標誌的函數,而不是將標誌作爲參數傳遞給函數。像這樣:

import argparse 
flag1=True 
flag2=True 
flag3=True 

def fun1(): 
    ... 
    if flag1: 
     ..something.. 
    else: 
     ..something else.. 
    #fun1 also uses the other flags in a similar way 
    ... 

def fun2(): 
    ... 
    if flag2: 
     ..something.. 
    else: 
     ..something else.. 
    #fun1 also uses the other flags in a similar way 
    ... 

def main() 
    ... 
    args=parser.parse_args() 
    ... 
    global flag1 
    flag1=args.flag1 
    # and so on for the other flags 
    fun1() 
    fun2() 

我已經導致相信它是不好的做法,使用全局變量在python許多問題的答案在這裏(this,例如)。這也適用於這裏嗎?我有點不情願將標誌作爲參數傳遞,因爲我將傳遞太多變量作爲參數。

處理由命令行參數設置的標誌的最佳方法是什麼?

+0

你可以做高清FUN1(參數) – xfx

+0

你可以簡單地傳遞ARGS作爲參數,只用一個來完成。 – Srgrn

+0

謝謝!會這樣做!應該有這個想法。 – Slothworks

回答

2

最簡單的解決辦法是要麼通過所有標誌您的所有功能(如單一args對象),或者只傳遞取決於哪個函數使用該標誌的相關標誌。

現在這確實可以成爲一個相當的負擔,特別是嵌套函數調用,你很快就不得不將整個標誌從函數傳遞到函數...函數......這裏的治療是使用一個類,所以你可以方法之間共享狀態:

class Command(object): 
    def __init__(self, flags): 
     self.flags = flags 

    def fun1(self): 
     ... 
     if self.flags.flag1: 
      ..something.. 
     else: 
      ..something else.. 

    def fun2(self): 
     ... 
     if self.flags.flag2: 
      ..something.. 
     else: 
      ..something else.. 


    def run(self): 
     self.fun1() 
     self.fun2()  

def main() 
    ... 
    args=parser.parse_args() 
    cmd = Command(args) 
    cmd.run() 
0

我還是一個初學者,但關鍵字參數似乎是一個相當不錯的解決方案,對我來說你的問題。我用的是這樣的:

def foo(**kwargs): 
    verbose = kwargs.get('verbose', 0) # set default value for your options 
    if verbose > 2: 
     print >> sys.stderr, 'some debug message or sth like that' 
    if verbose > 0: 
     print 'verbose note' # for sth like 'your_app -v' 

if __name__=='__main__' 
    args=parser.parse_args() 
    verbose = args.flag1 
    foo(verbose=verbose) 
    foo() 
相關問題