Динамическая передача параметров в функцию в Python - PullRequest
0 голосов
/ 11 декабря 2018

Я хочу написать код, который будет проверять словарь на наличие ключа и, если он существует, установить его в качестве параметра в качестве параметра.

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 голосов
/ 11 декабря 2018

Я бы также предложил использовать аргумент default для pop вместо проверки на существование: thisTitle = kwargs.pop('name', default);так что вы не делаете и in, и pop.

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

Становится:

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

Может быть лучше использовать get, а не pop если удаление ключа из словаря не является обязательным эффектом:

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

Тогда ваша функция вернет None, а не выдаст NameError, если аргумент ключевого слова name не указан.

0 голосов
/ 11 декабря 2018

Попробуйте:

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
...