Dict как kwargs с большим количеством переменных, чем используется - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть словарь с несколькими ключами и их соответствующими значениями.

Я хочу, чтобы ключи работали как переменные, а их значения - как значения каждой переменной, чтобы использовать их в функции.

Я понимаю, что это позволяет мне иметь функцию с любым количеством аргументов:

def myFunc(**kwargs):
    ...

И это позволяет мне использовать ключи в словаре в качестве аргументов:

myDict={
   "foo1":"bar1",
   "foo2":"bar2",
   "foo3":"bar3"}

def myFunc(foo1, foo2):
   ...

myFunc(**myDict)

Моя проблема в том, что у меня есть 3 функции, которые принимают равные аргументы, но у них также есть свои собственные аргументы.

Как я могу использовать свой словарь в качестве аргумента для всех моих 3 функций, при условии, что в этом словаре есть несколько выигравших ключей 'не может использоваться в каждой функции.

Примерно так:

myDict={
   "foo1":"bar1",
   "foo2":"bar2",
   "foo3":"bar3",
   "foo4":"bar4",
   "foo5":"bar5"}

def fun1(**kwargs):
    #takes foo1, foo2 and foo5 as args
def fun2(**kwargs):
    #takes foo1, foo2 and foo4 as args
def fun3(**kwargs):
    #takes foo1, foo2 and foo3 as args

fun1(**myDict)
fun2(**myDict)
fun3(**myDict)

Как это можно сделать?

Ответы [ 2 ]

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

Как это сделать?

Это плохой API.Не делай этого.Функции должны быть явными для входных данных, если только нет действительно веской причины принять **kwargs (например, вам нужно передать их куда-то еще, и вы заранее не знаете, какие здесь могут быть ключевые слова).

Как я могу использовать свой словарь в качестве аргумента для всех моих трех функций при условии, что в этом словаре есть некоторые ключи, которые не будут использоваться в каждой функции.

Вместо того, чтобы иметьсловарь, который является объединением всех аргументов (foo1-foo5), используйте словарь, который имеет пересечение всех аргументов (foo1, foo2).Передайте другие аргументы отдельно:

fun1(foo5=x, **common)
fun3(foo3=y, **common)
0 голосов
/ 04 декабря 2018

У меня есть два способа решить эту проблему.Во-первых, как то, что вы сделали:

def fun1(**kwargs):
    #takes foo1, foo2 and foo5 as args
    foo1 = kwargs.get("foo1")
    foo2 = kwargs.get("foo2")
    foo5 = kwargs.get("foo5")
    # do something with foo1, foo2, foo5

Вы определяете функцию с помощью kwargs и выбираете only то, что вам нужно внутри функции, и игнорируете все остальное.

Другой способ - точно определить, что вам нужно в сигнатуре функции плюс пустышка kwargs:

def fun1(foo1=None, foo2=None, foo5=None, **kwargs):
    #takes foo1, foo2 and foo5 as args
    # do something with foo1, foo2, foo5

В обоих случаях функцию можно вызвать с помощью fun1(**myDict).Только последний вызовет предупреждение от статического анализатора о том, что у вас есть неиспользуемая переменная kwargs, которая является преднамеренной.

...