【发布时间】:2020-04-21 10:55:22
【问题描述】:
我有一个脚本,它在命令行上接受参数来创建 matplotlib.patches.Rectangle 对象。
可以传递给 Rectangle 构造函数的典型参数可能类似于(在 Python 中,没有参数解析):
patches.Rectangle(
xy=(15000,0),
width=9.4,
height=4,
color='peachpuff'
)
用户可以像这样在命令行上对其进行编码:
--patches '[{ "x" : 15000,"y" : 0,"width" : 9.4,"height" : 4,"color" : "peachpuff"}]'
这个 json 数组加载了json.loads。请注意,大多数参数可以直接传递给Rectangle 构造函数,但xy 元组会导致问题:json.loads 永远不会生成元组类型,所以你可以' t 用这种方式创建一个元组。
为了解决这个问题,我让用户传递单独的 x 和 y 映射,然后像这样组合它们:
p.add_argument('--patches', help='A JSON array of patches.Rectangle object arguments to patch onto the chart',
type=json.loads)
# stuff
# put some patches on
if args.patches:
def from_json(json):
ret = dict(json)
del ret['x']
del ret['y']
ret['xy'] = (json['x'], json['y'])
return ret
for pjson in args.patches:
p = from_json(pjson)
ax.add_patch(patches.Rectangle(**p))
该代码的一半(基本上是所有from_json)只是处理将x 和y args 转换为xy = (x, y) 元组。
还有更优雅/Pythonic 的方式来处理这个问题吗?
它可能涉及对 json 输入的更清晰处理,或者可能在命令行上传递除 json 以外的其他内容(但它必须与当前方法具有粗略的特征奇偶性)。
【问题讨论】:
-
json 中的元组通常使用数组表示。你不能用那个吗?另外,它可能不一定是一个元组,只是一些具有 2 个值的可迭代对象。
-
优雅/Pythonic 的方式是不关心它是否特别是一个元组,正如@JeffMercado 评论的那样,而只是一些两元素序列。
-
@JeffMercado - 我真是个白痴,我不认为
Rectangle可以接受 2 元素列表而不是元组,但它可以,没问题。 -
如果你真的想要脚本参数中字典的python语法,你也可以做某种
ast.literal_eval
标签: python json command-line parameter-passing