Python 通过可变数量的参数生成命令
我的方法接受两个属性和一个Python 通过可变数量的参数生成命令,python,json,Python,Json,我的方法接受两个属性和一个json列表,并返回相应的值。它按预期工作 现在,我想添加这个功能,让它返回相应的值,而不管它的深度如何 例如,现在它接受parent和child参数并返回一个值(见下文):return jsonprops[parent][child] 是否可以让它接受任意数量的参数并返回相应的值返回jsonprops[parent][child1][child2]..[childN] 我发现了一个将变量数量的args传递给方法(如下)的示例,但我不确定如何构造返回jsonprops[
json
列表,并返回相应的值。它按预期工作
现在,我想添加这个功能,让它返回相应的值,而不管它的深度如何
例如,现在它接受parent
和child
参数并返回一个值(见下文):return jsonprops[parent][child]
是否可以让它接受任意数量的参数并返回相应的值<代码>返回jsonprops[parent][child1][child2]..[childN]
我发现了一个将变量数量的args
传递给方法(如下)的示例,但我不确定如何构造返回jsonprops[parent][child]
,因为它必须在[]
中对args进行排序
所需的解决方案将为return jsonprops[parent][child]
以及return jsonprops[parent][child1][child2][child3][child4]返回一个值
将可变数量的参数传递给方法:
def multipleArgs(*arg):
print "Called with", len(arg), "arguments:", arg
正在读取json文件:
import json
def read_json(parent, child, jsonprops=[])
return jsonprops[parent][child]
exampleFile = json.loads(open(example.json).read())
childInfo = read_json('parentProps', 'childProp1', exampleFile)
print childInfo
示例json
{
"generalInfo": {
"name": "example",
"schemaVersion": "1.0",
"description": "metadata to be an example"
},
"parentProps": {
"childProp1": "hi 1",
"childProp2": "hi 2",
"childProp3": {
"newParent": [
{
"parent1": [
{
"grandChild1": "GC1",
"grandChild2": "GC2",
"grandChild3": "GC3"
},
{
"numberofKids": "5",
"grandChild4": "GC4",
"grandChild5": "GC5",
"grandChild6": "GC6"
}
],
"parent2": [
{
"numberofKids": "1",
"grandChild11": "GC11",
"grandChild12": "GC12",
"grandChild13": "GC13"
},
{
"grandChild14": "GC14",
"grandChild15": "GC15",
"grandChild16": "GC16"
}
]
}
]
}
}
}
与模块一起使用如何:
然后,您的函数将加载json并在objectpath的帮助下返回结果(如果有)与模块一起使用如何:
然后,函数将加载json并在objectpath的帮助下返回结果(如果有)要从数据结构中的任意深度访问值,可能需要使用循环。这里有一个简单的方法:
def get_value(data, *keys):
for key in keys:
data = data[key]
return data
您还可以使用reduce
函数执行的隐式循环(在Python 3中,它是functools
模块的一部分):
要从数据结构中的任意深度访问值,可能需要使用循环。这里有一个简单的方法:
def get_value(data, *keys):
for key in keys:
data = data[key]
return data
您还可以使用reduce
函数执行的隐式循环(在Python 3中,它是functools
模块的一部分):
我喜欢这种方法,不幸的是我没有objectpath
模块。我喜欢这种方法,不幸的是我没有objectpath
模块。谢谢你的解决方案。我正在使用Python2.x。我尝试了您的方法,但它在get_value data=data[key]TypeError中的第15行的1
:文件“/jsonTest.py”上出现了错误:列表索引必须是整数,而不是str
。尽管它一直工作到深度3('parentProps'、'childProps3'、'newParent')。由于数据结构中有一个列表,newParent
之后的键需要是一个整数(请注意,Grant
键和值分为两个字典)。尝试get_value(jsonprops,'parentProps','childProp3','newParent',0',grander1')
应该可以工作。谢谢,它可以工作。但是,它不适用于嵌套列表(检查更新的json文件。我无法想象为什么嵌套列表会是一个问题,只要每个级别都包含一个整数索引。我看不到json数据的任何更新,所以我无法给出任何细节。我花了几分钟时间整理了格式…请参见上文。感谢您的解决方案。我正在使用Python 2.x。我试过了。)r方法,但它在get\u value data=data[key]TypeError中的第15行的1
文件“/jsonTest.py”上出错。列表索引必须是整数,而不是str
。尽管它一直工作到深度3('parentProps'、'childProps3'、'newParent')。由于数据结构中有一个列表,newParent
之后的键需要是一个整数(请注意,grant
键和值分为两个字典)。请尝试get_值(jsonprops,'parentProps',childProp3',newParent',0,'grander1')
它应该可以工作。谢谢,它可以工作。但是它不适用于嵌套列表(检查更新的json文件。我无法想象为什么嵌套列表会有问题,只要每个级别都包含一个整数索引。我看不到json数据有任何更新,所以我无法给出任何细节。我花了几分钟的时间来整理格式…请参见上文。)。
from functools import reduce # this line is only needed in Python 3
from operator import getitem
def get_value(*args): # data should be first argument, followed by any number of keys
return reduce(getitem, args)