动态将参数传递给Python中的函数

时间:2018-12-11 12:17:15

标签: python parameters parameter-passing

我想编写一个代码,该代码将检查字典中的键,如果存在则将其设置为函数作为参数。

def myFunction(*args, **kwargs):
    # do stuffs
    if('name' in kwargs):
        thisTitle = kwargs.pop('name')        

    print(thisTitle)
    ...
    return thisTitle

t = {}

if 'name' in t.keys() 
    and 'param1' in t.keys() 
    and 'param2' in t.keys():

    res = myFunction(name      = t['name'], 
                     myparam1  = t['param1'],
                     secondPar = t['param2'])

elif 'name' in t.keys() 
    and 'param1' in t.keys():

    res = myFunction(name=t['name'], 
                     myparam1=t[param1])

elif 'name' in t.keys():
    res = myFunction(name=t['name'])

如果我有10个参数怎么办?必须有更好的方法。

2 个答案:

答案 0 :(得分:2)

尝试一下:

def myFunction(*args, **kwargs):
    # do stuffs
    if('name' in kwargs):
        thisTitle = kwargs.pop('name')

    print(thisTitle)

    if('param1' in kwargs):
        print(kwargs['param1'])

    if('param2' in kwargs):
        print(kwargs['param2'])
    # ...
    return thisTitle


t = {'name': "same_name"}

myFunction(**t)

t = {'name': 'same_name',
     'param1': 'val1',
     'param2': 'val2'}

myFunction(**t)

输出:

$ python3 stack.py 
same_name
same_name
val1
val2

答案 1 :(得分:0)

我还建议在default上使用pop参数,而不要检查是否存在:thisTitle = kwargs.pop('name', default);因此您不会同时使用inpop

if('name' in kwargs):
    thisTitle = kwargs.pop('name')

成为:

thisTitle = kwargs.pop('name', None)

使用get而不是pop可能更好,除非从字典中删除键是必需的效果:

thisTitle = kwargs.get('name', None)

然后,当未提供None关键字参数时,您的函数将返回NameError而不是生成name