У меня есть json-диктонар, например:
{
"name": "Root Folder",
"type": "folder",
"children": [
{
"name": "Folder A",
"type": "folder",
"children": [
{
"name": "Folder A-A",
"type": "folder",
"children": [
{
"name": "File A-A-1",
"type": "file",
"children": []
}
]
},
{
"name": "Folder A-B",
"type": "folder",
"children": []
}
]
},
{
"name": "Folder B",
"type": "folder",
"children": [
{
"name": "Folder B-A",
"type": "folder",
"children": [
{
"name": "Folder B-A-A",
"type": "folder",
"children": []
}
]
},
{
"name": "Folder B-B",
"type": "folder",
"children": []
}
]
},
{
"name": "File Root",
"type": "file",
"children": []
}
]
}
из этого диктонара. Я хочу автоматически получать значения «Путь», «Имя» и «Тип» для каждого члена, а также для уровня,поэтому root - это level0, папка A level 1, папка AA level 2 и т. д.
Для этой цели я создал следующий код Python, который берет json-словарь и помещает значения из него в массивы:
import json
import os
from jinja2 import Template
with open('Folder_structure.json') as f:
data = json.load(f)
def arr4tmpl(data,arr_path,arr_name,arr_type,arr_level):
for child in data['children']:
arr_path.extend([child['path']])
arr_name.extend([child['name']])
arr_type.extend([child['type']])
arr_level.extend([arr4tmpl.level])
arr4tmpl.level+=1
arr4tmpl(child,arr_path,arr_name,arr_type,arr_level)
arr4tmpl.level-=1
return(arr_path,arr_name,arr_type,arr_level)
def main():
arr4tmpl.level = 0
arr=[]
arr_path=[]
arr_name=[]
arr_type=[]
arr_level=[]
(arr_path,arr_name,arr_type,arr_level)=arr4tmpl(data,arr_path,arr_name,arr_type,arr_level)
Это прекрасно работает, но теперь его нужно превратить в объектно-ориентированное решение.Поэтому я подумал о следующем (отредактировано в соответствии с ответами, спасибо за это) :
import json
import os
from jinja2 import Template
class CreateTemplate(object):
def __init__(self):
self.arr_path=[]
self.arr_name=[]
self.arr_type=[]
self.arr_level=[]
self.level=0
def arr4tmpl(self,data,level):
for child in data['children']:
arr_path.extend([child['path']])
arr_name.extend([child['name']])
arr_type.extend([child['type']])
arr_level.extend([level])
level+=1
arr4tmpl(self,child,level)
level-=1
return(arr_path,arr_name,arr_type,arr_level)
with open('Folder_structure.json') as f:
data = json.load(f)
template=CreateTemplate()
template.arr4tmpl(data,level)
Идея состоит в том, чтобы инициализировать параметры с помощью init Method, а затемрасширить их в методе arr4tmpl.Насколько я понимаю, создание объекта должно выполнить метод init, но при выполнении кода я получаю сообщение об ошибке:
File "Folder_structure.py", line 34, in <module>
template.arr4tmpl(data,level)
NameError: name 'level' is not defined