我有一个脚本,它可以通过命令行接受参数来创建一个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
永远不会生成元组类型,所以不能通过这种方式创建元组。为了解决这个问题,我让用户传递单独的
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
参数转换成元组 xy = (x, y)
。
有没有更加优雅/Pythonic的方式来处理呢?
可能涉及到更干净的 json 输入处理,或者在命令行上传递其他类型的参数(但必须与当前方法具有大致相同的功能)。
Rectangle
可以接受一个由2个元素组成的列表而不是元组,但它确实可以,没有问题。 - BeeOnRopeast.literal_eval
这种方式。 - modesitt