在函数中传递可选参数 \- 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 来运行我的脚本,它会遇到错误(如预期的那样)。我的问题是,你如何创建一个可选参数,它可以根据情况传递或不传递?

例如:

python 文件名.py 最低

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

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

原文由 Kfir Cohen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 456
2 个回答

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

请注意,在 Python 中,定义可选参数默认值的表达式仅在执行 def 语句时被求值一次(对于顶级函数首先导入),这可能导致意外行为(参见 “Least Astonishment”和 Mutable Default Argument )。

此外,“默认值”必须是一个 expression ,而不是一个语句,所以你不能在这里做任何错误处理。 wrt /您尝试使用 sys.argv[2] 作为默认值的情况,至少有两个原因是错误的:

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

这里正确的解决方案是处理“入口点”代码( __main__ 部分)中的所有用户输入( sys.argv 或其他) - 你的函数应该不知道参数值在哪里来自( sys.argv ,HTTP请求,文本文件或其他)。

长话短说:使用硬编码值(如果有意义的话)或“哨兵”值( 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)

原文由 bruno desthuilliers 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

原文由 Dharmik 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题