Как передать строку, которая будет оцениваться как аргументы positional и keyword?

91
8

Я использую модуль под названием credstash, который содержит эту функцию:

def getSecret(name, version="", region=None,
table="credential-store", context=None,
dynamodb=None, kms=None, **kwargs):

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

Поэтому у меня есть переменная arg_action с этим содержимым:

TEST_CREDSTASH, table=perf-accounts-credentials-store

Я хочу сделать что-то вроде этого:

credstash.getSecret(arg_action)

Проблема заключается в том, что она захватывая все содержимое arg_action вместо интерпретации их в качестве позиционного аргумента name и ключевое слово аргумента table

credstash.ItemNotFound: Item {'name': 'TEST_CREDSTASH, table=perf-accounts-credentials-store'} couldn't be found.

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

Я решил решить эту проблему следующим образом:

def credstash_action(key_id, table_name, action, args):
action_list = {
"get": "getSecret",
"getall": "getAllSecrets",
"list": "listSecrets",
"put": "putSecret",
"putall": "putAllSecretsAction"
}
function_list = {
"getSecret": get_credstash_secret,
"getAllSecrets": get_all_credstash_secrets,
}
cred_action = action_list.get(action)
cred_function = getattr(credstash, cred_action)
args_string = " ".join(args)
function_list.get(cred_action)(function=cred_function, key_id=key_id, table_name=table_name, args=args_string)

def get_credstash_secret(**kwargs):
print(kwargs['function'](kwargs['args'], table=kwargs['table_name']))

def get_all_credstash_secrets(**kwargs):
print(kwargs['function'](table=kwargs['table_name']))

спросил(а) 2018-03-15T21:15:00+03:00 2 года, 7 месяцев назад
1
Решение
58

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

pos_args = ['TEST_CREDSTASH']
kw_args = dict(table="perf-accounts-credentials-store")

credstash.getSecret(*pos_args, **kw_args)

Список и словарь сами могут быть элементами одного списка или кортежа:

args = (['TEST_CREDSTASH'], {"table": "perf-accounts-credentials-store"})

credstash.getSecret(*args[0], **args[1])

ответил(а) 2018-03-15T21:42:00+03:00 2 года, 7 месяцев назад
41

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

Передайте отдельные пары ключ-значение из вашего словаря arg_action в соответствующие аргументы функции credstash.getSecret.

credstash.getSecret(arg_action['name'], table=arg_action['table'])

ответил(а) 2018-03-15T21:17:00+03:00 2 года, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема