繁体   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