我想创建一个可以接受 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 许可协议
这在 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]
作为默认值的情况,至少有两个原因是错误的:len(sys.argv) < 3
sys.argv
,因此您不能在不同的上下文中重用它这里正确的解决方案是处理“入口点”代码(
__main__
部分)中的所有用户输入(sys.argv
或其他) - 你的函数应该不知道参数值在哪里来自(sys.argv
,HTTP请求,文本文件或其他)。长话短说:使用硬编码值(如果有意义的话)或“哨兵”值(
None
是一个很好的候选者)作为可选参数的默认值,并执行所有用户输入在__main__
部分中解析(或者在 --- 部分调用的函数中更好main()
从__main__
部分调用的函数,这样你就不会用不相关的命名空间变量污染模块):