阅读下面的python dict或其等效的yaml并生成等效的python函数调用
mydict = {'RouteAdd': {'route_config': {'RouteConfig': {'table_name': 'my table', 'app_id': 'my app', 'nexthops': [{'NexthopInfo': {'nexthop_index': 2, 'nexthop_address': {'GatewayAddress': {'ethernet_mac': 'my mac', 'nexthop_ip': 'my ip'}}, 'if_name': 'my interface'}}]}}}}
它的yaml(为了便于阅读):
RouteAdd:
route_config:
RouteConfig:
app_id: "my app"
nexthops:
- NexthopInfo:
if_name: "my interface"
nexthop_address:
GatewayAddress:
ethernet_mac: "my mac"
nexthop_ip: "my ip"
nexthop_index: 2
table_name: "my table"
我想阅读上面的yaml或python dict,并调用如下:
RouteAdd(route_config=Routeconfig(app_id="my app",nexthops=[NexthopInfo(if_name="my interface",nexthop_address=GatewayAddress(ethernet_mac="my mac",nexthop_ip="my ip"),nexthop_index=2)],table_name="my table"))
基本上,备用层次结构是一个对象。我粘贴的是一个小剪辑。寻找一个递归函数,通过读取yaml或python dict并将其转换为上面的格式来执行此操作,以便我可以调用并执行该函数。任何帮助深表感谢。谢谢
答案 0 :(得分:1)
试试这个:
def call_dict(d):
k, v = list(d.items())[0] # ('RouteAdd', {route_config: ...})
kwargs = {}
for k2, v2 in v.items():
if isinstance(v2, dict):
kwargs[k2] = call_dict(v2)
elif isinstance(v2, list):
kwargs[k2] = [(call_dict(v3) if isinstance(v3, dict) else v3) for v3 in v2]
else:
kwargs[k2] = v2
return globals()[k](**kwargs)
测试:
def test1(t_arg=None, t_arg2=None):
return t_arg + sum(t_arg2)
def test2(t_arg=None):
return t_arg
res = test1(t_arg=1, t_arg2=[test2(t_arg=2), test2(t_arg=3)])
print(res) # 6
test_dict = {
'test1': {
't_arg': 1,
't_arg2': [
{'test2': {'t_arg': 2}},
{'test2': {'t_arg': 3}},
]
}
}
res = call_dict(test_dict)
print(res) # 6
<强> UPD:强>
作为代码串:
def str_of_code(d):
k, v = list(d.items())[0]
kwargs = {}
for k2, v2 in v.items():
if isinstance(v2, dict):
kwargs[k2] = str_of_code(v2)
elif isinstance(v2, list):
kwargs[k2] = '[{}]'.format(', '.join(
(str_of_code(v3) if isinstance(v3, dict) else repr(v3)) for v3 in v2)
)
else:
kwargs[k2] = repr(v2)
return '{}({})'.format(k, ', '.join('{}={}'.format(*i) for i in kwargs.items()))
test_dict = {
'test1': {
't_arg': 1,
't_arg2': [
{'test2': {'t_arg': 2}},
{'test2': {'t_arg': 3}},
]
}
}
res = str_of_code(test_dict)
print(res) # test1(t_arg=1, t_arg2=[test2(t_arg=2), test2(t_arg=3)])
答案 1 :(得分:0)
尝试了论坛中建议的所有可用方法,但不知何故没有人为我正在寻找的解决方案而努力。因此,作为初学者,通过以下非传统的寻找和替换方式解决了它。如果有人有更好的解决方案,请发布,我想使用它。
api_map_complete = {api: {'config': {'AddressConfig': {'unit': 0, 'port_name': "my_name", 'address': "my address", 'family': 2}}}}
def dict_to_obj(mystr,flag):
global api_string
if re.search(':\(',mystr):
if flag % 2 == 0:
api_string=mystr.replace(":(","(",1)
flag=flag+1
else:
api_string=mystr.replace(":("," = (",1)
flag=flag+1
dict_to_obj(api_string,flag)
else:
mystr=mystr.replace(":"," = ")
mystr=mystr.replace(",",", ")
api_string=mystr
for combo in api_map_complete:
api_name=combo.keys()[0]
for k,v in combo.iteritems():
api_string=str(v)
api_string=api_string.replace("{","(")
api_string=api_string.replace("}",")")
api_string=api_string.replace(" ","")
api_string=api_string.replace(":'",":\"")
api_string=api_string.replace("',","\",")
api_string=api_string.replace("')","\")")
api_string=api_string.replace("'","")
dict_to_obj(api_string,1)
#print api_string
api_obj=api_name+api_string
print api_obj