You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何正确传递以字符串形式存储的方法参数?

如何正确传递多参数给foo.add方法?

场景描述

你有一个接收大量关键字参数的方法foo.add,示例调用如下:

foo.add(a=True, b=0, c='z', d=(1, 0, 0), e=2, f='g')
foo.add(a=False, b=3, c='z', d=(1, 0, 2), e=2, f='z')
foo.add(a=True, b=10, c='h', d=(1, 3, 0), e=2, f='2')

你尝试将每组参数以字符串形式存入字典后直接传入,导致报错:

foo_dict = {
    "a": "a=True, b=0, c='z', d=(1, 0, 0), e=2, f='g'",
    "b": "a=False, b=3, c='z', d=(1, 0, 2), e=2, f='z'",
    "c": "a=True, b=10, c='h', d=(1, 3, 0), e=2, f='2'",
}
foo.add(foo_dict["a"])  # 报错:方法期望接收多个关键字参数,而非单个字符串

正确解决方案:字典存储+参数解包

把每组参数定义为字典(而非字符串),调用方法时用**操作符解包字典,将键值对转换为方法的关键字参数:

foo_dict = {
    "a": {"a": True, "b": 0, "c": 'z', "d": (1, 0, 0), "e": 2, "f": 'g'},
    "b": {"a": False, "b": 3, "c": 'z', "d": (1, 0, 2), "e": 2, "f": 'z'},
    "c": {"a": True, "b": 10, "c": 'h', "d": (1, 3, 0), "e": 2, "f": '2'},
}

# 解包字典调用方法,效果与直接写参数完全一致
foo.add(**foo_dict["a"])
foo.add(**foo_dict["b"])
foo.add(**foo_dict["c"])

这种方式清晰易维护,没有安全风险,是Python中传递关键字参数的标准做法。


不推荐的字符串解析方式(存在安全风险)

如果必须保留字符串形式的参数,可以用eval解析,但强烈不建议——eval会执行任意代码,若字符串来源不可信,会导致安全问题:

foo_dict = {
    "a": "a=True, b=0, c='z', d=(1, 0, 0), e=2, f='g'",
    "b": "a=False, b=3, c='z', d=(1, 0, 2), e=2, f='z'",
    "c": "a=True, b=10, c='h', d=(1, 3, 0), e=2, f='2'",
}

# 仅在完全信任字符串内容时使用此方法
foo.add(**eval(f"dict({foo_dict['a']})"))
foo.add(**eval(f"dict({foo_dict['b']})"))
foo.add(**eval(f"dict({foo_dict['c']})"))

内容的提问来源于stack exchange,提问作者Nima Akbarzadeh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 11:55:39