如何传递要评估为位置和关键字参数的字符串?

时间:2018-03-15 18:15:35

标签: python

我使用名为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']))

2 个答案:

答案 0 :(得分:0)

将字符串传递给模仿通常如何将参数传递给函数将无法正常工作,正如您所观察到的那样。

arg_action字典中的单独键值对传递到credstash.getSecret函数的相应参数。

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

答案 1 :(得分:0)

您可以将位置参数存储在列表中,将关键字参数存储在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])