【问题标题】:How can I pass a string to be evaluated as positional and keyword arguments?如何传递要评估为位置和关键字参数的字符串?
【发布时间】:2018-03-15 18:15:35
【问题描述】:

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

【问题讨论】:

    标签: python


    【解决方案1】:

    将字符串传递给模仿如您所见,通常将参数传递给函数的方式将不起作用。

    arg_action 字典中的单独键值对传递给credstash.getSecret 函数的适当参数。

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

    【讨论】:

    • 问题是我在 credstash 上有更多的函数,我不想为每个函数编写参数,因为它们是不同的。这就是为什么我想要一个可以改变参数的变量。
    • 我明白了。不幸的是,正如您所观察到的,在您尝试传递字符串时将不起作用。实现您想要的“正确”并且可能是最易读的方式是我建议的方式。如果您需要在代码中的多个位置执行此操作,请考虑编写一个包装函数来为您处理它。
    • 有没有办法从字符串名称调用函数呢?我有类似 function_list = { "getSecret": 'get_credstash_secret' } func = function_list.get(action_list.get(action)) func()
    • 您需要正确格式化示例代码。请将其添加到您的原始问题中
    • @mormaii2 您在字典中存储对函数本身的引用,而不是其名称。 function_list = { 'getSecret': get_credstash_secret }; function_list['getSecret']() 调用函数get_credstash_secret..
    【解决方案2】:

    您可以将位置参数存储在列表中,将关键字参数存储在字典中,然后单独传递每个集合。

    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])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-14
      • 1970-01-01
      • 1970-01-01
      • 2012-05-07
      • 1970-01-01
      • 2010-11-04
      • 2015-07-05
      • 2011-09-07
      相关资源
      最近更新 更多