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
相关产品推荐
相关产品推荐

