Python中的默认参数不一致

Python中的默认参数不一致,python,python-2.7,Python,Python 2.7,在Python2.7中使用默认参数时,我遇到了意外的行为。一个参数被默认值覆盖,而不是使用调用方传入的值。考虑以下功能: def vm_list(domain, username, server, verbose, cluster, datacenter, name, regex, template_only, detailed_list, vm_status): print 'inside vm_list vm_stauts is', vm_status

在Python2.7中使用默认参数时,我遇到了意外的行为。一个参数被默认值覆盖,而不是使用调用方传入的值。考虑以下功能:

def vm_list(domain, username, server, verbose, cluster, datacenter, name,
            regex, template_only, detailed_list, vm_status):

    print 'inside vm_list vm_stauts is', vm_status
    vcenter_request = "get_registered_vms"
    vmlist = vcenter_connect(server, user, password, vcenter_request, vm_status)

def vcenter_connect(server, user, password, request,
                    source_vm=None, target_vm=None,
                    res_pool=None, num=1, vm_status=None):

    print 'inside vcenter_connect vm_stauts is', vm_status
vm\u列表
首先调用
vm\u状态
作为字符串传入,例如“poweredOff”。在这个函数中,
vm\u status
与预期的“poweredOff”相等,但是当我将值传递给
vcenter\u connect
时,它会被默认参数
None
覆盖。我在
vcenter\u connect
中使用了其他默认参数,但它们按预期工作,也就是说,它们仅在未传入任何内容时使用默认值

运行相关部分来测试字符串值可以得到以下结果:

inside vm_list vm_stauts is poweredOff
inside vcenter_connect vm_stauts is None

我做错了什么?

您将
vm\u status
作为第五个位置参数传递给
vcenter\u connect
,但该函数的第五个位置参数是
source\u vm
,因此
vm\u status
将获得其默认值
None

相反,您必须告诉它在前4个位置参数之后发送的关键字参数:

vmlist = vcenter_connect(server, user, password, vcenter_request, vm_status=vm_status)

您将
vm\u status
作为第五个位置参数传递给
vcenter\u connect
,但该函数的第五个位置参数是
source\u vm
,因此
vm\u status
将获得其默认值
None

相反,您必须告诉它在前4个位置参数之后发送的关键字参数:

vmlist = vcenter_connect(server, user, password, vcenter_request, vm_status=vm_status)

非常感谢。这就是诀窍。这对我来说是一个学习步骤,因为我不太习惯关键字参数。谢谢!这就是诀窍。这对我来说是一个学习步骤,因为我不太习惯使用关键字参数。