2012-04-23 2 views
0

私は、複数の引数をとることができるpythonモジュールを作成しています。メソッドの定義に引数を渡す最善の方法は何でしょうか?
Pythonでクラスのinitに複数のパラメータを渡す最善の方法は何ですか?

 
def abc(arg): 
    ... 

abc({"host" : "10.1.0.100", "protocol" : "http"}) 
 
def abc(host, protocol): 
    ... 

abc("10.1.0.100", "http") 
 
def abc(**kwargs): 
    ... 

abc(host = "10.1.0.100", protocol = "http") 

それとも何か他のもの?

編集

私はそれらのどれもが必要とされていないこれらの引数(ユーザ名、パスワード、プロトコル、ホスト、パスワード2)を実際に持っています。

+1

'def abc(host、protocol)'がより明示的です。 '明示的なものは暗黙的なものよりも優れている.' –

+0

そのクラスの文脈の中で意味を持つものは何か。 –

答えて

2
def abc(host, protocol): 
    ... 

abc("10.1.0.100", "http") 
abc(host="10.1.0.100", protocol="http") 

引数argsまたはキーワードargsを使用して呼び出す場合は、引数の数とスキップした場合に異なります。私の例では、キーワードargsを使って関数を呼び出すのにはあまり役に立ちません。他のソリューションが悪い理由


は現在、いくつかの理由:

abc({"host" : "10.1.0.100", "protocol" : "http"}) 

これは、一般的に、実際のキーワード引数(通常はJavaScript)を欠く言語で使用されるキーワード引数のための回避策です。これらの言語ではいいですが、Pythonではそれが絶対に何も得られないので間違っています。あなたがdictからargsで関数を呼び出すことを望むなら、とにかくいつでもabc(**{...})を行うことができます。

def abc(**kwargs): 

人々は、この関数が多分多分任意の引数を受け入れることを期待しています。それに加えて、彼らはどのような議論が可能であるかを見ておらず、あなた自身で特定の議論を要求するコードを書かなければならない。

+0

私は実際にそれらのどれも必要でないそれらの引数(username、password、protocol、host、password2)を持っています。 – guimobob

+1

この場合、デフォルト値( 'None'は意味があります)を与え、引数の順序を選択して、使用頻度の高い引数が最初に来るようにします。 – ThiefMaster

0

すべての引数が先にわかっている場合は、明示的な引数リストを使用します。オプションで、デフォルト値の場合はdef abc(arg1="hello", arg2="world",...)などです。これにより、コードが最も読みやすくなります。

この関数を呼び出すと、abd("hello", "world")またはabc(arg1="hello", arg2="world")のいずれかを使用できます。私は4つか5つ以上の引数がある場合、より長いフォームを使用します。それは味の問題です。

0

これは実際には、コンテキスト、デザイン、およびメソッドの目的によって異なります。

パラメータを定義し、強制されている場合は、最良のオプションは次のとおりです。

def abc(host, protocol): 
    ... 

abc('10.1.0.100', 'http') 

パラメータは、その後、定義されているが、オプションされている場合には:

def abc(host=None, protocol=None): # I used None, but put a default value 
    ... 

あなたは位置引数thorugh、それを呼び出すことができますabc('10.1.0.100', 'http')またはその名前によってabc(protocol='http')

あなたが最初に受け取る引数がわからない場合は、 )の書式文字列で十分その後、最良のオプションは、**kwargs引数使用している:

def abc(**kwargs): 
    ... 

を、このように、あなたは名前付き引数を使用して、それを呼び出す必要があります。

関連する問題