2017-01-20 10 views
1

kargsを使用するのは正しいですか?次のpythonコードのシナリオでkwargsを使用するのは正しいですか?

私は5つのパラメータを必要とする機能を持っています。これらのパラメータのうちの2つはオプションです。だから、私はそれを削除することができますように:

def f(p1, p2, p3, p4, p5, o1=None, o2=None) 

または

def f(**kwargs) 

私はのparamsでこのようなことをやっているので:

orig_path = "{0}/{1}/{3}/{4}".format(p1, p2, p3, p4) 

または

orig_path = "{p1}/{p2}/{p3}/{p4}".format(kwargs) 

どのスタイルがPythonで正しい方法であるのか分かりません宣言で使用する。 kwargsの正しい使い方を探すガイドがありますか?私はアマゾンで見たことがありますが、boto3 APIは通常kwargs構造を使用していますが...

+3

最初の文字を使用してください。 functio-defだけで、5つのパラメータが必要であることがわかります。これは情報獲得の一種です。また、関数内にいくつかのコードを保存することもできます。 (仮定:p1-p5が必要です) – sascha

+2

@saschaあなたはこれを答えにして、PythonのZenの「明示的な方が暗黙の方が良い」という原則に言及する可能性があります。 – blubberdiblub

+0

@blubberdiblub PythonのZenのあなたの言及がここでは非常に関係しているので、自由に行ってください。 – sascha

答えて

1

可能であれば、すべてのパラメータを関数定義に書き出し、理想的には説明的な名前を付けるべきです。

Zen of Python

明示的、暗黙よりも優れていると言います。

とも

可読性がカウントされます。

パラメータを明示的にすると、関数が多すぎたり小さすぎたり、キーワードパラメータが存在しない場合など、多くの間違いを防ぐのに役立ちます。

これはまた、関数から期待されるパラメータの数とどの順序で、また可能なキーワードパラメータのデフォルトが何であるかを定義から簡単に見つけることができるため、読みやすくするのに役立ちます。場合によっては、ドキュメントを見なくても良いパラメータ名を使って関数が何をするかを推測することもできます。

一部のIDEでは、通話を書き込んだときに自動的に定義をルックアップして、入力中に発生する可能性のある問題を警告します。

この操作を行います。*argsと012を使用することがOKであるときに

def twiddle_knobs(*args, **kwargs): # WARNING: never do this! 
    my_radio.modify_control(radio.TUNEFREQ, max(min(args[0], 120.0), 85.0)) 
    my_radio.modify_control(radio.VOL_MASTER, args[1]/100.0) 

    if kwargs.get("panning") is not None: 
     my_radio.modify_control(radio.VOL_LEFT, min(1.0 - kwargs["panning"]/100.0, 1.0)) 
     my_radio.modify_control(radio.VOL_RIGHT, min(1.0 + kwargs["panning"]/100.0, 1.0)) 

    for control, param, default in ((radio.EQU_BASS, "bass",  6.0), 
            (radio.EQU_MID, "midrange", -2.0), 
            (radio.EQU_TREB, "treble", 1.5)): 

     my_radio.modify_control(control, kwargs.get(param, default), radio.DB) 

:これをしないでください

def twiddle_knobs(tuning, volume, panning=None, bass=6.0, midrange=-2.0, treble=1.5): 
    """Modify the most important radio controls.""" 

    my_radio.modify_control(radio.TUNEFREQ, value=max(min(tuning, 120.0), 85.0)) 
    my_radio.modify_control(radio.VOL_MASTER, value=(volume/100.0)) 

    if panning is not None: 
     my_radio.modify_control(radio.VOL_LEFT, value=min(1.0 - panning/100.0, 1.0)) 
     my_radio.modify_control(radio.VOL_RIGHT, value=min(1.0 + panning/100.0, 1.0)) 

    for control, value in ((radio.EQU_BASS, bass), 
          (radio.EQU_MID, midrange), 
          (radio.EQU_TREB, treble)): 

     my_radio.modify_control(control, value=value, unit=radio.DB) 

を?あなたは が似ているということのリストを受け取り、同じ機能を提供する必要がある場合*argsため

  • 一つの使用です。ただし、 でも通常のパラメータを使用し、呼び出し元に リストを明示的に渡すことができます。時には、func([thing])で関数を呼び出すと、 何かをまったく渡すことがほとんどない場合は特に、 のように見えることがあります。それらは時代であり、*argsは になります。あなたはパスにあなたの機能はあなたが がを制御することはできません、あなたはどの口述したくない別の関数の上を受信した位置および/またはキーワード 引数の一部を必要とする。また

  • 、あなたの 呼び出し元が渡されることが許されているパラメータは、明示的なパラメータの後に、*args*kwargs - が使用されます。

  • あなたはを強く 関連の機能と、彼らは が動的に変化する何かに依存する可能性があるため キーワードは、がどうなるか、あなたが正確に先行事前に定義することはできませんが、それはまたになるサーブのキーワードパラメータのセットを持っている場合使用する正当な理由は *kwargsです。

このリストは網羅的なものではありませんが、一般的な考えを示します。

関連する問題