簡體   English   中英

在函數中傳遞可選參數-python

[英]Passing an optional argument in a function - python

我想創建一個可以接受1個或2個參數的函數。 當前,我有一個函數,它通過CMD正好接受2個參數:

def test(self,countName,optionalArg):
        if countName == "lowest":
           #something
        if optionalArg == "furthest:
           #something
        else:
           #something else

if __name__ == '__main__':
        countName = sys.argv[1]
        optionalArg = sys.argv[2]

        temp = len(sys.argv)
        for i in xrange(1,temp):

            sys.argv.pop()

然后,我將運行:

python filename.py最低的

使用此方法意味着必須傳遞第二個arg。 如果我嘗試僅通過傳遞一個arg來運行腳本,則它將遇到錯誤(如預期的那樣)。 我的問題是,如何根據情況創建一個可選參數,該參數可以傳遞也可以不傳遞?

例如:

python filename.py最低

在這種情況下,我希望程序執行“ #something else”腳本,因為未傳遞任何內容,並且與“ festest”不同。

請不要為我寫代碼,我在這里學習:)

在FineManual(tm)中對此進行了解釋: https ://docs.python.org/2/tutorial/controlflow.html#more-on-defining-functions

請注意,在Python中,定義def為可選參數的默認值的表達式在執行def語句時會被評估一次(首先是對頂層函數的導入),這可能導致意外行為(參見“最少驚訝”和可變默認參數 )。

另外,“默認值”必須是表達式 ,而不是語句,因此您不能在此處進行任何錯誤處理。 wrt /您嘗試使用sys.argv[2]作為默認值的情況,至少有兩個原因是錯誤的:

  1. 正如您已經注意到的,如果len(sys.argv) < 3
  2. 它使您的函數依賴於sys.argv ,因此您不能在不同的上下文中重用它

正確的解決方案是處理“入口點”代碼( __main__部分)中的所有用戶輸入( sys.argv或其他內容)-您的函數不應該知道參數值的來源( sys.argv ,HTTP請求) ,文本文件等)。

因此,總而言之:使用硬編碼值(如果有意義)或“前哨”值( None是最佳候選值)作為可選參數的默認值,並在__main__進行所有用戶輸入解析部分(甚至在__main__部分調用的main()函數中更好main()這樣您就不會使用無關的變量污染模塊的命名空間):

def func(arg, optarg=None):
    #code here


def main(*args):
    #parse args
    #call func with the right args

if __name__ == "__main__":
    import sys 
    main(*sys.argv)

您可以通過向要忽略的參數提供默認參數值來編寫函數,例如optionalArg = None(無論您想要什么),這樣就可以使用單個參數調用該函數。

一種非常非常丑陋的方法是使用異常檢查參數是否已定義:

import sys

if __name__ == '__main__':
    arg = sys.argv[1]

    try:
        optionalArg = sys.argv[2]
    except IndexError:
        optionalArg = ""
    else:
        print "sure, it was defined."

我建議您不要使用它,因為您永遠不要處於不知道是否定義了變量的情況下,可以使用更好的方法來處理它,但是在某些情況下(不是您的)可能會有用,我僅出於這個原因添加它。

像這樣嗎 有點代碼抱歉:D

def function(value, opt = ""):
  print("Value: " + value)
  if not opt == "":
    print("Optional: " + opt)

您可以通過字典。 如果您在調用函數時未顯式初始化它,則默認值為None。

變體:

def somefunc(*args, **kwargs):
   if 'optional_arg' in kwargs:
       print kwargs['optional_arg']

您可以使用*args傳遞任意數量的參數並將其作為列表接收,或使用**kwargs發送關鍵字參數並將其作為字典接收。

這是*args的示例:

def test(count_name, *args):

    if count_name == "lowest":    
        print('count_name received.')  

    if args and args[-1] == "furthest":    
        print('2nd arg received.')    

    else:    
        print('No second arg given.')    

    return None


if __name__ == '__main__':
    count_name = 'lowest'
    optional_arg = 'furthest'

    print('Test 1:')
    test(count_name, optional_arg)
    # Displays:
    # Test 1:
    # count_name received.
    # 2nd arg received.

    print('\n\nTest 2:')
    test(count_name)
    # Test 2:
    # count_name received.
    # No second arg given.

這是通過傳遞可選參數的方式,而不是通過定義變量的默認值的方式來初始化變量在內存中的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM