2016-08-16 7 views
0

[OK]私は何をしようとしているのかを説明するのに適切な用語を使用することすら確信していません。とにかく、Pythonで関数呼び出しをプログラム的にまたは動的に構築できるかどうかを知りたいです。Pythonの関数呼び出しをプログラムでビルドする方法

私を説明しましょう。

私はそうのように、オプションのパラメータで定義されたクラス内の機能があります。だから、

class Agents(object): 

     def update(self, agent_id, full_name = "none", role = "none", status = "none"): 
      # do some stuff 

を私はその機能を使用するために行くとき、私は、私はちょうど1つ、2つ、またはすべての3のを更新することができるときオプションのパラメータ時にはfull_nameとroleでも可能ですが、statusやstatusやroleではなくnameやstatusだけでなく、まあまあです。

私はelifステートメントの大きなブロックですべての順列を説明することができますが、それは本当に不器用な私を殴る。

は現在、私はそうのような関数を呼び出しています:

an_agent = Agents() 
    an_agent.update(agent_id = r_agent_id) 

がそれを行う前に、呼び出しの引数を追加するように、プログラムでその関数呼び出しを構築するためにとにかくあります。私はそうのような複数のシナリオを占めることができるように:とにかく

an_agent = Agents() 
    an_agent.update(agent_id = r_agent_id, full_name = r_full_name) 

または

an_agent = Agents() 
    an_agent.update(agent_id = r_agent_id, full_name = r_full_name, status = r_status) 

、これにアプローチする最良の方法は何ですか?

答えて

1

私が正しく理解していれば、私は、これはあなたが探しているものだと思う:

params = {} 

if x: 
    params['full_name'] = 'something' 
if y: 
    params['role'] = 'something else' 

an_agent.update(r_agent_id, **params) 

UPDATE

他のオプションは、あなたがAgentsのコードを制御すると仮定すると、あります。例えば、あなたはこのようにメソッドを再定義することができます:

def update(self, agent_id, full_name=None, role=None, status=None): 
    if full_name is None: full_name = 'none' 
    if role is None: role = 'none' 
    if status is None: status = 'none' 
    ... 

と、常にすべての引数渡し:

full_name = None 
role = None 
status = None 

if x: 
    full_name = 'something' 
if y: 
    role = 'something else' 

an_agent.update(r_agent_id, full_name, role, status) 

または多分同じupdateの定義を維持し、単なる文字列'none'にパラメータを初期化します。

+0

私はちょうど '**'構文は、一般的に関連付けられた単語 '** kwargs'を使ってグーグルグーグルできることを付け加えたいと思います。ここでいくつかの答えがどのように動作します:[1](http://stackoverflow.com/a/1769475/5847976)[2](http://stackoverflow.com/a/3394898/5847976)[3] (http://stackoverflow.com/a/36908/5847976) – jadsq

+0

素晴らしいこと、私はこれを消化させ、それを行ってみましょう。私はいくつかのフォローアップの質問を持っているかもしれません。ありがとう男これは素晴らしいです! – JOG88

+1

うん、** kwargsは確かに解決策でした。これを私の関数のいくつかに渡って実装することで、不要なif文を大量に取り除くことができました。コードは今やとても清潔です。感謝の男、答えをマーク。 – JOG88

関連する問題