2016-05-22 3 views
0

デフォルトの引数を使用するとPython 2.7で予期しない動作が発生します。呼び出し元が渡した値を使用する代わりに、デフォルトで1つの引数がオーバーライドされています。次の関数を考えてみましょう:Pythonのデフォルトの引数が一貫していない

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_listは、「パワーオフ」として、文字列として渡されたvm_statusで最初に呼び出されます。この関数の内部では、vm_status"poweredOff"と同じですが、値をvcenter_connectに渡すと、デフォルトの引数Noneでオーバーライドされています。 。

:何が渡されていない場合、彼らはデフォルト値のみを使用している、つまり、私は vcenter_connectに他のデフォルト引数を使用していますが、それらは期待通りに働いている

文字列値をテストするためにrelevent部品を実行すると、私は、この与えます

inside vm_list vm_stauts is poweredOff 
inside vcenter_connect vm_stauts is None 

私は間違っていますか?

答えて

2

あなたはvcenter_connectに第五位置パラメータとしてvm_statusを渡すが、その関数の第五位置パラメータはsource_vmので、vm_statusNoneのデフォルトを取得します。

代わりに、あなたが最初の4つの位置のものの後に送信されるキーワードパラメータにそれを伝える必要があります。

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

ありがとうございました!それはトリックです。これは、私がキーワードパラメータにあまり慣れていないので、私の学習ステップです。 –

関連する問題