在函数中传递可选参数 - python

时间:2016-02-08 08:33:38

标签: python arguments optional

我想创建一个可以带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"脚本,因为什么都没有通过,它不同于"最远的"。

请不要为我编写代码,我在这里学习:)

7 个答案:

答案 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]作为默认值的情况,至少有两个原因是错误的:

  1. 正如您已经注意到的那样,如果len(sys.argv) < 3
  2. 则会中断
  3. 它使您的函数依赖于sys.argv,因此您无法在不同的上下文中重复使用它
  4. 这里正确的解决方案是处理“入口点”代码(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.

这是传递可选参数的方式,而不是通过定义变量的默认值,该变量在内存中初始化变量。