Получить словарь текущих параметров функции - PullRequest
1 голос
/ 16 марта 2019

Мне недавно пришлось использовать функцию, условно распределяющую задачи в другие функции, с множеством обязательных и необязательных именованных аргументов (например, манипулирование строками соединения, конфигами искровых соединителей и т. Д.), И мне пришло в голову, что это было бы действительно «чище» (или «питонски») иметь синтаксис, позволяющий мне передавать все аргументы из функции в другую, похожую на эту:

def sisterFunction(**kwargs) : # Doing things with a bunch of mandatory and optional args
  <do various things/>

def motherFunction(a,b,**kwargs) : 
  <do various things/>
  sisterFunction(**allArgs)

где allArgs - это словарь, содержащий ключи a, b и все в kwargs. Это звучит так, как будто Python был бы склонен разрешить и облегчить, но я не могу найти что-то похожее на реализованный «супер-карг». Есть ли простой способ сделать это? Есть ли очевидная веская причина, что это не вещь?

Ответы [ 2 ]

1 голос
/ 16 марта 2019
def sisterFunction(**kwargs):
    pass

def motherFunction(a, b, **kwargs):
    sisterFunction(a=a, b=b, **kwargs)

kwargs в sisterFunction будет содержать a и b ключи с соответствующими значениями.

ОБНОВЛЕНИЕ

Если вы неЕсли вы хотите передать длинный список параметров функции через a=a, есть обходной путь для получения allArgs:

def motherFunction(a, b, **kwargs):
    allArgs = locals().copy()
    allArgs.update(allArgs.pop('kwargs', {}))
    sisterFunction(**allArgs)
0 голосов
/ 16 марта 2019

Я бы, наверное, просто использовал kwargs

def sisterFunction(**kwargs):
    pass

def motherFunction(**kwargs):
    # use the values directly from 'kwargs'
    print(kwargs['a'])

    # or assign them to local variables for this function
    b = kwargs['b']

    sisterFunction(**kwargs)

Вероятно, это вариант с наименьшим количеством кода в сигнатурах вашей функции (определения всех параметров функции).

A KeyError будет вызвано, если некоторые параметры не были переданы функции и функция пытается их использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...