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)