如何在 python 中使用 json.loads 直接将变量名称作为 dict 键传递?

how to pass directly variable name as dict key with json.loads in python?

我正在制作一个编写其他脚本的脚本,从终端调用脚本时参数作为 JSON 传递。

需要编写的脚本中包含字典。 此字典中的关键值之一是变量名(不是字符串)调用策略。

我的问题是这样的。

d = json.loads(sys.argv[2])

# d should looks like that
d = {
  "stopLossValue": 5,
  "strategy": strategy,
  "strategyTitle": "week5"
}

dic = """
parameterDict = {}
""".format(json.dumps(d, sort_keys=True, indent=4))

运行 脚本 return 如果我将策略键值设置为字符串,该错误会消失。

错误:

Traceback (most recent call last):
  File "updateCandleStrategy.py", line 11, in <module>
    d = json.loads(sys.argv[2])
  File "/usr/lib/python3.4/json/__init__.py", line 318, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.4/json/decoder.py", line 343, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.4/json/decoder.py", line 361, in raw_decode
    raise ValueError(errmsg("Expecting value", s, err.value)) from None
ValueError: Expecting value: line 1 column 506 (char 505)

有没有简单的方法可以实现我的目标?

谢谢

从命令行传递 json 字符串时,引号/转义字符之一很有可能被底层 shell.

解释

所以这不是传递 json 字符串的 viable/reliable 方法。传递一个包含 json 数据的文件并读取它:

with open(sys.argv[2]) as f:
   d = json.load(f)

来自 windows 控制台的示例,仅打印第二个参数:

S:\python>foo.py ff "d = {"s":12,"d":15}"
d = {s:12,d:15}

引号已被删除。需要加倍。

在 Linux 终端上,将您的参数用单引号括起来可以解决大多数情况,但是,直到您偶然发现一个包含单引号的值...

为什么不使用 getoptargparse 和 build/parse 正确的命令行而不是传递字典?