[英]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]
作為默認值的情況,至少有兩個原因是錯誤的:
len(sys.argv) < 3
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.