在函数python中传递可选参数

2024-09-28 03:21:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个可以接受1个或2个参数的函数。 目前,我有一个函数,它通过CMD接受两个参数:

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 lowest furthest

使用这意味着必须传递第二个参数。如果我试图通过传递一个参数来运行脚本,它会遇到一个错误(如预期的那样)。我的问题是,如何创建一个可选参数,它可以被传递,也可以不被传递,这取决于具体情况?

例如:

python filename.py lowest

在这种情况下,我希望程序执行“#其他”脚本,因为没有传递任何内容,而且它与“最远”不同。

请不要为我编写代码,我是来学习的:)


Tags: 函数py脚本参数ifsysfilenametemp
3条回答

这在FineManual(tm)中有解释:https://docs.python.org/2/tutorial/controlflow.html#more-on-defining-functions

注意,在Python中,定义可选参数默认值的表达式在执行def语句(这是顶级函数的第一次导入)时仅为eval'd ony一次,这可能会导致意外行为(cf"Least Astonishment" and the Mutable Default Argument)。

此外,“默认值”必须是表达式,而不是语句,因此不能在此处进行任何错误处理。wrt/您尝试使用sys.argv[2]作为默认值的情况,至少有两个原因是错误的:

  1. 正如您已经注意到的,如果len(sys.argv) < 3
  2. 它使您的功能依赖于sys.argv,因此您不能在不同的上下文中重用它

这里正确的解决方案是处理“入口点”代码(即__main__部分)中的所有用户输入(sys.argv或其他内容)-您的函数不应该知道参数值来自何处(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)

通过向要忽略的参数提供默认参数值(如optionalArg=None(无论您想要什么)),可以编写函数。通过这样做,您可以使用单个参数调用函数。

像这样的?有点代码对不起:D

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

相关问题 更多 >

    热门问题