好的,我甚至不确定用于描述我想要做的事情的正确术语。无论如何,我想知道是否可以在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)
无论如何,最好的方法是什么?
答案 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'
。