【问题标题】:Dynamical passing parameters to a function in Python在 Python 中将参数动态传递给函数
【发布时间】:2018-12-11 12:17:15
【问题描述】:

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

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 个参数怎么办?一定有更好的办法。

【问题讨论】:

标签: python parameters parameter-passing


【解决方案1】:

试试这个:

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

【讨论】:

    【解决方案2】:

    我还建议在pop 上使用default 参数,而不是检查是否存在: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)
    

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

    【讨论】:

    • 感谢@Dan D,非常有用的提示!我总是在 if 之前设置一个默认值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 2012-07-30
    • 2015-01-23
    • 1970-01-01
    • 2018-11-12
    相关资源
    最近更新 更多