Python如何以编程方式构建函数调用

时间:2016-08-16 14:51:21

标签: python

好的,我甚至不确定用于描述我想要做的事情的正确术语。无论如何,我想知道是否可以在python中以编程方式或动态构建函数调用。

让我解释一下。

我在一个类中有一个函数,它使用可选参数定义,如:

    class Agents(object):

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

所以,当我去使用该功能时,我可能只更新一个,两个或全部3个可选参数。有时它可能是full_name和角色,但不是状态...或状态和角色,但不是名称,或只是状态,或者你得到的想法。

所以我可以用一大块if ifif语句处理这个问题以解释所有的排列,但这让我觉得非常笨拙。

目前我正在调用这样的函数:

    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 个答案:

答案 0 :(得分:1)

如果我理解正确,我认为这就是您正在寻找的:

params = {}

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

an_agent.update(r_agent_id, **params)

<强>更新

假设您控制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'