我想创建一个可以带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"脚本,因为什么都没有通过,它不同于"最远的"。
请不要为我编写代码,我在这里学习:)
答案 0 :(得分:3)
这在FineManual(tm):https://docs.python.org/2/tutorial/controlflow.html#more-on-defining-functions
中有解释请注意,在Python中,定义可选参数的默认值的表达式在执行def
语句时(首先导入顶级函数)进行eval'd ony,这可以导致意外行为(参见"Least Astonishment" and the Mutable Default Argument)。
此外,“默认值”必须是表达式,而不是语句,因此您无法在此处执行任何错误处理。 wrt /你试图使用sys.argv[2]
作为默认值的情况,至少有两个原因是错误的:
len(sys.argv) < 3
sys.argv
,因此您无法在不同的上下文中重复使用它这里正确的解决方案是处理“入口点”代码(sys.argv
部分)中的所有用户输入(__main__
或其他) - 您的函数应该不知道参数值的来源来自(sys.argv
,HTTP请求,文本文件或其他)。
所以简而言之:使用硬编码值(如果有意义)或“sentinel”值(None
是一个很好的候选者)作为可选参数的默认值,并执行所有操作用户在__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)
答案 1 :(得分:1)
您可以通过为要忽略的参数提供默认参数值来编写函数,例如optionalArg = None(无论您想要什么),通过执行此操作,您可以使用单个参数调用该函数。
答案 2 :(得分:0)
如果定义了参数,非常非常丑陋的方法是使用异常进行检查:
import sys
if __name__ == '__main__':
arg = sys.argv[1]
try:
optionalArg = sys.argv[2]
except IndexError:
optionalArg = ""
else:
print "sure, it was defined."
我建议你不要使用它,因为你永远不会遇到你不知道变量是否被定义的情况,有更好的方法可以解决这个问题,但在某些情况下(不是你的) )可以是有用的,我只是因为这个原因添加它。
答案 3 :(得分:0)
这样的东西?有点代码抱歉:D
def function(value, opt = ""):
print("Value: " + value)
if not opt == "":
print("Optional: " + opt)
答案 4 :(得分:0)
您可以传递字典。或者,如果在调用函数时没有显式初始化它,则默认值为None。
答案 5 :(得分:0)
变体:
def somefunc(*args, **kwargs):
if 'optional_arg' in kwargs:
print kwargs['optional_arg']
答案 6 :(得分:0)
您可以使用*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.
这是传递可选参数的方式,而不是通过定义变量的默认值,该变量在内存中初始化变量。