10  json/dict

10.1 判断是否为字典

import re
my_dict = {"key": "value"}

if isinstance(my_dict, dict):
    print("这是一个字典")
else:
    print("这不是一个字典")
这是一个字典
type(my_dict)
dict

10.2 获取键值

my_dict = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}

# 获取所有键
keys = my_dict.keys()
print("所有的键:", keys)

# 获取所有值
values = my_dict.values()
print("所有的值:", values)

# 获取所有键值对
items = my_dict.items()
print("所有的键值对:", items)

# 遍历字典并获取键值对
for key, value in my_dict.items():
    print(f"键: {key}, 值: {value}")

# 使用get()方法获取键对应的值
value1 = my_dict.get('key1')
print("key1对应的值:", value1)

# 指定默认值,在键不存在时返回默认值
value4 = my_dict.get('key4', '默认值')
print("key4对应的值(不存在时返回默认值):", value4)
所有的键: dict_keys(['key1', 'key2', 'key3'])
所有的值: dict_values(['value1', 'value2', 'value3'])
所有的键值对: dict_items([('key1', 'value1'), ('key2', 'value2'), ('key3', 'value3')])
键: key1, 值: value1
键: key2, 值: value2
键: key3, 值: value3
key1对应的值: value1
key4对应的值(不存在时返回默认值): 默认值

10.3 删除键

my_dict = {'a': 1, 'b': 2, 'c': 3}
del my_dict['a']
my_dict
{'b': 2, 'c': 3}
my_dict = {'a': 1, 'b': 2, 'c': 3}
my_dict.pop('a')
my_dict
{'b': 2, 'c': 3}
my_dict.pop("d", "不存在")
'不存在'
my_dict.clear()

my_dict
{}

10.4 浅拷贝和深拷贝

浅拷贝只拷贝最外层,不拷贝字典内部的套嵌的字典,如果套嵌字典有修改,会影响到原字典,需要用深拷贝才能保证原字典不受影响。

# 取第一行的数据

# first_row_data = data[0].copy()  

first_row_data = copy.deepcopy(data[0])

import copy
# print(f"first_row_data是字典类型吗: {isinstance(first_row_data, dict)}")

# 清空值,使之成为空行
first_row_data['key'] = str(uuid4())


for data_index in first_row_data.keys():
    print(f"data_index: {data_index}")
    if data_index not in ["key", "dept", "user_name", "table_name"]:
        cell_value = first_row_data.get(data_index)
        # 坑: cell_value = first_row_data.get[data_index]
        if isinstance(cell_value, dict):
            # 为字典对象
            cell_value['value'] = ''
        else:
            first_row_data[data_index] = ''

    data.append(first_row_data)

    # print(f"add_new_blank_line: {data}")
    data_collect_table_data = data

10.5 json对象(字典)和json字符串互相转换

存入数据库前需将字典对象转换为规范的json字符串:json.dumps()。否则取出时不能正常转换为字典对象。
从数据库取回json字符串再转换为字典对象:json.loads()
json字符传递至前端,数字型数字必须转换为字符型数字,否则为非法的序列化对象而报错。

recentlyChangedOrSelectRow = json.dumps(recentlyChangedOrSelectRow, ensure_ascii = False)   # 这个很重要,保持json字符串的规范性(key和value为双引号,且按需转义)

# 取出后,将json字符串转换为字典对象 
query = cls.select(cls.row_data).where(
                (fn.JSON_EXTRACT(cls.row_data, '$.user_name') == user_name)
                &
                (fn.JSON_EXTRACT(cls.row_data, '$.table_name') == table_name)
            )

result_dicts_list = [json.loads(row.row_data) for row in query]

10.5.1 json文件读写

import json

# 准备要写入的数据
data = {
    "name": "John Doe",
    "age": 30,
    "city": "New York"
}

# 指定文件名
filename = "data/example.json"

# 使用json.dump()方法将数据写入JSON文件
with open(filename, 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii = False, indent=4)

print(f"数据已成功写入到{filename}")
数据已成功写入到data/example.json
import json

# 同样的文件名
filename = "data/example.json"

# 使用json.load()方法从JSON文件中读取数据
with open(filename, 'r', encoding='utf-8') as f:
    data_loaded = json.load(f)

print("读取的数据为:", data_loaded)
读取的数据为: {'name': 'John Doe', 'age': 30, 'city': 'New York'}

10.6 解包

**

10.6.1 解包字典作为关键字参数

my_dict = {'a': 1, 'b': 2, 'c': 3}

# 解包字典作为关键字参数
def my_function(a, b, c):
    print(a, b, c)

my_function(**my_dict)  # 等同于 my_function(a=1, b=2, c=3)
1 2 3

10.6.2 创建新字典

# 创建新字典
new_dict = {'d': 4, **my_dict}
print(new_dict)  # 输出 {'d': 4, 'a': 1, 'b': 2, 'c': 3}
{'d': 4, 'a': 1, 'b': 2, 'c': 3}

10.7 JSON路径操作

import json

import jsonpath

import json
from jsonpath import jsonpath
 
# 示例 JSON 数据
data = '''
    {
       "商店":{
           "书籍":[{
              "分类":"惊悚",
              "作者":"R.L.斯坦",
              "书名":"鸡皮疙瘩",
              "价格":18.95
           },{
              "分类":"冒险",
              "作者":"J.K.罗琳",
              "书名":"哈利波特与火焰杯",
              "书号":"ND-2131-34421",
              "价格":52.99
           },{
              "分类":"科幻",
              "作者":"刘慈欣",
              "书名":"三体",
              "价格":65.35
           },{
              "分类":"科幻",
              "作者":"刘慈欣",
              "书名":"流浪地球",
              "价格":32.99
           }]
       }
    }
'''
 
# 解析 JSON 数据
json_data = json.loads(data)
 
# 进行 JSONPath 查询
titles = jsonpath(json_data, "$.商店.书籍[*].书名")
 
# 打印匹配结果
for title in titles:
    print(title)
鸡皮疙瘩
哈利波特与火焰杯
三体
流浪地球
import json
from jsonpath import jsonpath

def get_matches_as_dict(json_obj, json_path_expr):
    # 查找所有匹配的值
    values_list = jsonpath(json_obj, json_path_expr)
    
    # 构造结果字典,这里以路径表达式为键,匹配到的所有值组成列表为值
    # 注意:此实现简化处理,实际使用中可能需要更复杂的逻辑来处理路径与值的关系
    result_dict = {json_path_expr: values_list}
    
    return result_dict

# 示例 JSON 数据
json_str = '''
{
  "store": {
    "book": [
      { "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95 },
      { "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99 }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
}
'''

# 将 JSON 字符串转为字典
json_data = json.loads(json_str)

# 示例 JSONPath 表达式
json_path_expression = '$..price'

# 调用函数并打印结果
result = get_matches_as_dict(json_data, json_path_expression)
result
{'$..price': [8.95, 12.99, 19.95]}

10.7.1 渲染出路径全称和对应值的字典

这个函数对于从数据库提取json_data,渲染用json_path作为占位符的docx文件特别重要 这个函数对于Dash应用中Patch回调特别重要。

import json
import pandas as pd
def traverse_json(data, path=''):
    if isinstance(data, dict):
        for key, value in data.items():
            new_path = f"{path}.{key}" if path else key
            traverse_json(value, new_path)
    elif isinstance(data, list):
        for index, item in enumerate(data):
            new_path = f"{path}[{index}]"
            traverse_json(item, new_path)
    else:
        print(f"Path: {path}, Value: {data}")

# 示例用法
json_data = [{
    "name": "John Doe",
    "age": 30,
    "address": {
        "street": "123 Main St",
        "city": "New York",
        "state": "NY"
    },
    "hobbies": ["reading", "coding", "gaming"]
}]

traverse_json(json_data)
Path: [0].name, Value: John Doe
Path: [0].age, Value: 30
Path: [0].address.street, Value: 123 Main St
Path: [0].address.city, Value: New York
Path: [0].address.state, Value: NY
Path: [0].hobbies[0], Value: reading
Path: [0].hobbies[1], Value: coding
Path: [0].hobbies[2], Value: gaming
# 生成 df,方便查询
import pandas as pd

def traverse_json(data, path='', path_value_dict=None):
    if path_value_dict is None:
        path_value_dict = {'Path': [], 'Value': []}

    if isinstance(data, dict):
        for key, value in data.items():
            new_path = f"{path}.{key}" if path else key
            traverse_json(value, new_path, path_value_dict)
    elif isinstance(data, list):
        for index, item in enumerate(data):
            new_path = f"{path}[{index}]"
            traverse_json(item, new_path, path_value_dict)
    else:
        path_value_dict['Path'].append(path)
        path_value_dict['Value'].append(data)
    
    return pd.DataFrame(path_value_dict)

# 示例用法
json_data = {
    "name": "John Doe",
    "age": 30,
    "address": {
        "street": "123 Main St",
        "city": "New York",
        "state": "NY"
    },
    "hobbies": ["reading", "coding", "gaming"]
}

traverse_json(json_data)
Path Value
0 name John Doe
1 age 30
2 address.street 123 Main St
3 address.city New York
4 address.state NY
5 hobbies[0] reading
6 hobbies[1] coding
7 hobbies[2] gaming

10.7.2 按路径取值

import json

def get_json_value(json_data, path):
    keys = path.split('.')
    value = json_data
    for key in keys:
        if isinstance(value, dict) and key in value:
            value = value[key]
        else:
            return None
    return value

# Example usage
json_data = {
    "key1": {
        "key2": {
            "key3": "value3"
        }
    }
}

path = "key1.key2.key3"
result = get_json_value(json_data, path)
print(result)  # Output: value3

path = "key1.key2.key4"
result = get_json_value(json_data, path)
print(result)  # Output: None
value3
None

10.7.3 按路径赋值

import json

def set_value_by_path(json_data, path, value):
    keys = path.split('.')
    current = json_data
    for key in keys[:-1]:
        if key not in current:
            current[key] = {}
        current = current[key]
    current[keys[-1]] = value


# 示例JSON对象
json_data = {
    "user": {
        "name": "John",
        "age": 30
    }
}

# 设置值到路径"user.email"
set_value_by_path(json_data, "user.email", "john@example.com")

print(json.dumps(json_data, indent=4))
{
    "user": {
        "name": "John",
        "age": 30,
        "email": "john@example.com"
    }
}

10.7.4 获取指定键名的路径

def find_paths(json_obj, target_key, current_path="", paths=[]):
    """
    递归地查找JSON对象中指定键名的所有路径
    Args:
    - json_obj: 要搜索的JSON对象
    - target_key: 目标键名
    - current_path: 当前的路径(用于递归)
    - paths: 存储找到的路径列表(用于递归)

    Returns:
    - paths: 所有找到的路径列表
    """
    if isinstance(json_obj, dict):
        for key, value in json_obj.items():
            if key == target_key:
                paths.append((current_path + '.' + key).strip('.'))
            if isinstance(value, dict) or isinstance(value, list):
                find_paths(value, target_key, current_path + '.' + key, paths)
    elif isinstance(json_obj, list):
        for index, value in enumerate(json_obj):
            find_paths(value, target_key, current_path + '.' + str(index), paths)
    return paths

# 示例JSON对象
sample_json = {
    "data": {
        "id": 1,
        "attributes": {
            "zip": 123443,
            "name": "John",
            "age": 30,
            "address": {
                "city": "New York",
                "zip": "10001"
            }
        }
    }
}

target_key = "zip"
paths = find_paths(sample_json, target_key)
print("Paths for key '{}':".format(target_key))
for path in paths:
    print(path)

json_data = {
    "json-data-filename": "static/session/3dd94ca4-a6c0-4265-8c04-062311332931.json",
    "fig-1": {
        "对角线": {
            "data-params": {
                "data-file-name": "stool.xlsx",
                "data-folder-path": "static/upload/484bb552-e914-4c7f-b6bc-75ed4165cf2b",
                "upload-task-id": "484bb552-e914-4c7f-b6bc-75ed4165cf2b",
                "df-columns": [
                    "Skatole",
                    "Trans-3-indoleacrylic acid",
                    "5-methoxyindoleacetic acid",
                    "AKI"
                ],
                "outcome-variable": "AKI",
                "independent-variable": [
                    "Trans-3-indoleacrylic acid",
                    "5-methoxyindoleacetic acid"
                ]
            },
            "curve-params": {
                "color": "#bb87ff"
            },
            "axis-params": {
                "xaxis": {
                    "color": "#bb87ff"
                }
            }
        },
        "roc": {
            "data-params": {
                "data-file-name": "stool.csv",
                "data-folder-path": "static/upload/589ecaed-7047-4d78-8f70-682a69eba040",
                "upload-task-id": "589ecaed-7047-4d78-8f70-682a69eba040",
                "df-columns": [
                    "AKI",
                    "Indole-mean-log",
                    "Indole-log-mean",
                    "Indole-3-acetaldehyde-log-mean",
                    "allMetabolics-log-mean"
                ],
                "outcome-variable": "AKI",
                "independent-variable": [
                    "Indole-mean-log",
                    "Indole-log-mean",
                    "Indole-3-acetaldehyde-log-mean"
                ]
            },
            "curve-params": {
                "color": "#fffc51"
            },
            "axis-params": {
                "xaxis": {
                    "color": "#fffc51"
                }
            }
        }
    },
    "current-fig": "fig-1",
    "current-ax": "对角线"
}


find_paths(json_data, 'color', paths=[])
Paths for key 'zip':
data.attributes.zip
data.attributes.address.zip
['fig-1.对角线.curve-params.color',
 'fig-1.对角线.axis-params.xaxis.color',
 'fig-1.roc.curve-params.color',
 'fig-1.roc.axis-params.xaxis.color']

10.7.5 路径列表转换为套嵌字典

用于dash的很多级联组件,如AntdCascader和Munu

def add_node(tree, path):
    current_node = tree
    for node in path:
        found = False
        for child in current_node['children']:
            if child['value'] == node:
                current_node = child
                found = True
                break
        if not found:
            new_node = {'value': node, 'label': node, 'children': []}
            current_node['children'].append(new_node)
            current_node = new_node

def paths_to_options(paths):
    options = []
    for path in paths:
        nodes = path.split('.')
        if not options:
            options.append({'value': nodes[0], 'label': nodes[0], 'children': []})
        else:
            add_node(options[0], nodes)
    return options

# 示例路径
paths = [
    'fig-1.对角线.curve-params.color',
    'fig-1.对角线.axis-params.xaxis.color',
    'fig-1.roc.curve-params.color',
    'fig-1.roc.axis-params.xaxis.color'
]

# 转换为所需的结构
result = paths_to_options(paths)[0]['children']
print(json.dumps(result, ensure_ascii = False, indent=4))
[
    {
        "value": "fig-1",
        "label": "fig-1",
        "children": [
            {
                "value": "对角线",
                "label": "对角线",
                "children": [
                    {
                        "value": "axis-params",
                        "label": "axis-params",
                        "children": [
                            {
                                "value": "xaxis",
                                "label": "xaxis",
                                "children": [
                                    {
                                        "value": "color",
                                        "label": "color",
                                        "children": []
                                    }
                                ]
                            }
                        ]
                    }
                ]
            },
            {
                "value": "roc",
                "label": "roc",
                "children": [
                    {
                        "value": "curve-params",
                        "label": "curve-params",
                        "children": [
                            {
                                "value": "color",
                                "label": "color",
                                "children": []
                            }
                        ]
                    },
                    {
                        "value": "axis-params",
                        "label": "axis-params",
                        "children": [
                            {
                                "value": "xaxis",
                                "label": "xaxis",
                                "children": [
                                    {
                                        "value": "color",
                                        "label": "color",
                                        "children": []
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }
        ]
    }
]

10.8 转换成yaml

Advantages of YAML:

Readability: YAML is known for its human-readable and easy-to-understand syntax. It uses indentation and whitespace to define the structure of the data, making it easier for humans to read and write compared to JSON.

Flexibility: YAML supports a wider range of data types, including strings, numbers, booleans, lists, maps, variable, and more. This flexibility allows for more expressive and complex configurations.

Comments: YAML supports comments, which can be useful for documenting and explaining the configuration settings. This can be helpful for maintaining the codebase and collaborating with others.

import json
import yaml

# JSON data
json_data = \
{
    "import" : {
        "dash" : ["flask@request", "dash", "dash@dcc, html", "dash.dependencies|Output, Input, State", "feffery_antd_components@fac"],
        "file": ["os", "shutil"],
        "data": ["pandas@pd"],
        "text" : ["uuid@uuid4"],
        "custom" : ["myplt"]

    },

    "app" : {
        "dash.Dash" : {
            "__name__" : "",
            "suppress_callback_exceptions" : True,
            "update_title" : None
        }
    },

    "config" : {
        "app.title" : "ROC PLOT",
        "app.server.secret_key" : "statitcal-plot",
        "app.server.static_folder" : "static"

    },

    "layout": {
        "fac.AntdDivider" : {
            "children" : "参数设置"
        }
    }
}

# Convert JSON to YAML
yaml_data = yaml.dump(json_data, allow_unicode=True)

# Print the YAML data
print(yaml_data)
app:
  dash.Dash:
    __name__: ''
    suppress_callback_exceptions: true
    update_title: null
config:
  app.server.secret_key: statitcal-plot
  app.server.static_folder: static
  app.title: ROC PLOT
import:
  custom:
  - myplt
  dash:
  - flask@request
  - dash
  - dash@dcc, html
  - dash.dependencies|Output, Input, State
  - feffery_antd_components@fac
  data:
  - pandas@pd
  file:
  - os
  - shutil
  text:
  - uuid@uuid4
layout:
  fac.AntdDivider:
    children: 参数设置

10.8.1 使用变量

10.8.1.1 Define a variable

name: John Doe
age: 30
city: Beijing

10.8.1.2 Use the variable

person:
  name: {{ name }}
  age: {{ age }}
  city: {{ city }}

In this example, we define a variable name, age, and city and then use them in the person section of the YAML file. The variables are enclosed in double curly braces {{ }} to indicate that they should be replaced with their corresponding values.

You can also define complex variables using YAML’s mapping and sequence syntax. For example:

10.8.1.3 Define a complex variable

person:
  name: John Doe
  age: 30
  city: Beijing

10.8.1.4 Use the complex variable

people:
  - {{ person }}
  - name: Jane Smith
    age: 28
    city: London

In this example, we define a complex variable person as a mapping, and then use it in the people sequence. We can also mix and match complex variables with simple variables.

By using variables in YAML, you can make your configuration files more flexible and reusable.

10.8.2 读取yaml文件为dict

import yaml

# Read the YAML file
with open('data/yaml-for-generate-app.yml', 'r') as file:
    yaml_data = yaml.safe_load(file)



# yaml_data
# Prettify the YAML data
pretty_yaml = yaml.dump(yaml_data, default_flow_style=False, indent=4, allow_unicode = True)

# Print the prettified YAML
# print(pretty_yaml)
import json
# Convert the YAML data to a dictionary
dict_data = dict(yaml_data)

# Prettify the print output
pretty_dict = json.dumps(dict_data, indent=4, separators=(',', ': '), ensure_ascii = False)

# Print the prettified dictionary
print(pretty_dict)
{
    "import": {
        "dash": [
            "flask|request+session",
            "dash",
            "dash|html+Output+Input+callback",
            "feffery_antd_components@fac",
            "feffery_utils_components@fuc"
        ],
        "data": [
            "pandas@pd"
        ],
        "plot": [
            "matplotlib.pyplot@plt",
            "matplotlib"
        ],
        "file": [
            "os",
            "shutil"
        ],
        "text": [
            "uuid|uuid4"
        ]
    },
    "directory": [
        "assets/",
        "static/upload",
        "static/img",
        "static/demo",
        "static/session",
        "static/dict"
    ],
    "app-setting": {
        "app = dash.Dash": {
            "__name__": "single-key",
            "suppress_callback_exceptions": true,
            "update_title": null
        },
        "app.server.secret_key": "statitcal-plot",
        "app.server.static_folder": "static",
        "app.title": "ROC PLOT",
        "matplotlib.use": "(Agg)",
        "upload_dir": "static/upload"
    },
    "app-run": {
        "app.run": {
            "debug": true,
            "port": 8088
        }
    },
    "params": {
        "current-ax-path": null,
        "current-fig": null,
        "current-ax": null,
        "plot-fig-axes-path": null,
        "图片-1": {
            "img-save-path": null,
            "theme-style": null,
            "ROC-1": {
                "data-params": {
                    "raw-data-file-path": null,
                    "calculatted-result-file-path": null
                },
                "plot-params": {
                    "args": {
                        "x": null,
                        "y": null,
                        "fmt": null,
                        "smooth": null
                    },
                    "kwargs": {
                        "color": null,
                        "linestyle": null,
                        "linewidth": null,
                        "marker": null,
                        "markersize": null,
                        "markeredgecolor": null,
                        "markerfacecolor": null,
                        "markeredgewidth": null,
                        "label": null,
                        "alpha": null,
                        "zorder": null
                    }
                }
            },
            "ROC-2": {
                "data-params": {
                    "raw-data-file-path": null,
                    "calculatted-result-file-path": null
                },
                "plot-params": {
                    "args": {
                        "x": null,
                        "y": null,
                        "fmt": null,
                        "smooth": null
                    },
                    "kwargs": {
                        "color": null,
                        "linestyle": null,
                        "linewidth": null,
                        "marker": null,
                        "markersize": null,
                        "markeredgecolor": null,
                        "markerfacecolor": null,
                        "markeredgewidth": null,
                        "label": null,
                        "alpha": null,
                        "zorder": null
                    }
                }
            },
            "ROC-3": {
                "data-params": {
                    "raw-data-file-path": null,
                    "calculatted-result-file-path": null
                },
                "plot-params": {
                    "args": {
                        "x": null,
                        "y": null,
                        "fmt": null,
                        "smooth": null
                    },
                    "kwargs": {
                        "color": null,
                        "linestyle": null,
                        "linewidth": null,
                        "marker": null,
                        "markersize": null,
                        "markeredgecolor": null,
                        "markerfacecolor": null,
                        "markeredgewidth": null,
                        "label": null,
                        "alpha": null,
                        "zorder": null
                    }
                }
            },
            "ROC-4": {
                "data-params": {
                    "raw-data-file-path": null,
                    "calculatted-result-file-path": null
                },
                "plot-params": {
                    "args": {
                        "x": null,
                        "y": null,
                        "fmt": null,
                        "smooth": null
                    },
                    "kwargs": {
                        "color": null,
                        "linestyle": null,
                        "linewidth": null,
                        "marker": null,
                        "markersize": null,
                        "markeredgecolor": null,
                        "markerfacecolor": null,
                        "markeredgewidth": null,
                        "label": null,
                        "alpha": null,
                        "zorder": null
                    }
                }
            },
            "对角线": {
                "plot-params": {
                    "args": {
                        "x": null,
                        "y": null,
                        "fmt": null
                    },
                    "kwargs": {
                        "color": null,
                        "linestyle": null,
                        "linewidth": null,
                        "marker": null,
                        "markersize": null,
                        "markeredgecolor": null,
                        "markerfacecolor": null,
                        "markeredgewidth": null,
                        "label": null,
                        "alpha": null,
                        "zorder": null
                    }
                }
            }
        },
        "图片-2": {
            "img-save-path": null,
            "theme-style": null,
            "ROC-1": {
                "data-params": {
                    "raw-data-file-path": null,
                    "calculatted-result-file-path": null
                },
                "plot-params": {
                    "args": {
                        "x": null,
                        "y": null,
                        "fmt": null,
                        "smooth": null
                    },
                    "kwargs": {
                        "color": null,
                        "linestyle": null,
                        "linewidth": null,
                        "marker": null,
                        "markersize": null,
                        "markeredgecolor": null,
                        "markerfacecolor": null,
                        "markeredgewidth": null,
                        "label": null,
                        "alpha": null,
                        "zorder": null
                    }
                }
            },
            "ROC-2": {
                "data-params": {
                    "raw-data-file-path": null,
                    "calculatted-result-file-path": null
                },
                "plot-params": {
                    "args": {
                        "x": null,
                        "y": null,
                        "fmt": null,
                        "smooth": null
                    },
                    "kwargs": {
                        "color": null,
                        "linestyle": null,
                        "linewidth": null,
                        "marker": null,
                        "markersize": null,
                        "markeredgecolor": null,
                        "markerfacecolor": null,
                        "markeredgewidth": null,
                        "label": null,
                        "alpha": null,
                        "zorder": null
                    }
                }
            },
            "ROC-3": {
                "data-params": {
                    "raw-data-file-path": null,
                    "calculatted-result-file-path": null
                },
                "plot-params": {
                    "args": {
                        "x": null,
                        "y": null,
                        "fmt": null,
                        "smooth": null
                    },
                    "kwargs": {
                        "color": null,
                        "linestyle": null,
                        "linewidth": null,
                        "marker": null,
                        "markersize": null,
                        "markeredgecolor": null,
                        "markerfacecolor": null,
                        "markeredgewidth": null,
                        "label": null,
                        "alpha": null,
                        "zorder": null
                    }
                }
            },
            "ROC-4": {
                "data-params": {
                    "raw-data-file-path": null,
                    "calculatted-result-file-path": null
                },
                "plot-params": {
                    "args": {
                        "x": null,
                        "y": null,
                        "fmt": null,
                        "smooth": null
                    },
                    "kwargs": {
                        "color": null,
                        "linestyle": null,
                        "linewidth": null,
                        "marker": null,
                        "markersize": null,
                        "markeredgecolor": null,
                        "markerfacecolor": null,
                        "markeredgewidth": null,
                        "label": null,
                        "alpha": null,
                        "zorder": null
                    }
                }
            },
            "对角线": {
                "plot-params": {
                    "args": [
                        {
                            "x": null
                        },
                        {
                            "y": null
                        },
                        {
                            "fmt": null
                        }
                    ],
                    "kwargs": {
                        "color": null,
                        "linestyle": null,
                        "linewidth": null,
                        "marker": null,
                        "markersize": null,
                        "markeredgecolor": null,
                        "markerfacecolor": null,
                        "markeredgewidth": null,
                        "label": null,
                        "alpha": null,
                        "zorder": null
                    }
                }
            }
        }
    },
    "layout": {
        "component": "html.Div",
        "id": {
            "type": "main-container-div",
            "index": "heihei"
        },
        "children": [
            {
                "component": "html.Div",
                "children": null,
                "id": "message-container"
            },
            {
                "component": "fac.AntdSteps",
                "steps": [
                    {
                        "keep-dict-unrendered": true,
                        "title": "步骤1",
                        "subTitle": "选择图层",
                        "description": [
                            {
                                "component": "fac.AntdDivider",
                                "children": "图层"
                            },
                            {
                                "component": "fac.AntdSpace",
                                "children": [
                                    {
                                        "component": "fac.AntdCascader",
                                        "id": "fig-axes-cascader",
                                        "placeholder": "选择图层对象",
                                        "expandTrigger": "hover",
                                        "options": [
                                            {
                                                "keep-dict-unrendered": true,
                                                "label": "图片-1",
                                                "value": "图片-1",
                                                "children": [
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-1",
                                                        "value": "ROC-1"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-2",
                                                        "value": "ROC-2"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-3",
                                                        "value": "ROC-3"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-4",
                                                        "value": "ROC-4"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "对角线",
                                                        "value": "对角线"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "箱形图",
                                                        "value": "箱形图"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "热图",
                                                        "value": "热图"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "坐标轴",
                                                        "value": "坐标轴"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "图注",
                                                        "value": "图注"
                                                    }
                                                ]
                                            },
                                            {
                                                "keep-dict-unrendered": true,
                                                "label": "图片-2",
                                                "value": "图片-2",
                                                "children": [
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-1",
                                                        "value": "ROC-1"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-2",
                                                        "value": "ROC-2"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-3",
                                                        "value": "ROC-3"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-4",
                                                        "value": "ROC-4"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "对角线",
                                                        "value": "对角线"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "箱形图",
                                                        "value": "箱形图"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "热图",
                                                        "value": "热图"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "坐标轴",
                                                        "value": "坐标轴"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "图注",
                                                        "value": "图注"
                                                    }
                                                ]
                                            },
                                            {
                                                "keep-dict-unrendered": true,
                                                "label": "图片-3",
                                                "value": "图片-3",
                                                "children": [
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-1",
                                                        "value": "ROC-1"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-2",
                                                        "value": "ROC-2"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-3",
                                                        "value": "ROC-3"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-4",
                                                        "value": "ROC-4"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "对角线",
                                                        "value": "对角线"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "箱形图",
                                                        "value": "箱形图"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "热图",
                                                        "value": "热图"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "坐标轴",
                                                        "value": "坐标轴"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "图注",
                                                        "value": "图注"
                                                    }
                                                ]
                                            },
                                            {
                                                "keep-dict-unrendered": true,
                                                "label": "图片-4",
                                                "value": "图片-4",
                                                "children": [
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-1",
                                                        "value": "ROC-1"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-2",
                                                        "value": "ROC-2"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-3",
                                                        "value": "ROC-3"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-4",
                                                        "value": "ROC-4"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "对角线",
                                                        "value": "对角线"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "箱形图",
                                                        "value": "箱形图"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "热图",
                                                        "value": "热图"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "坐标轴",
                                                        "value": "坐标轴"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "图注",
                                                        "value": "图注"
                                                    }
                                                ]
                                            }
                                        ]
                                    },
                                    {
                                        "component": "fac.AntdText",
                                        "id": "current-ax",
                                        "keyboard": true,
                                        "children": null,
                                        "style": {
                                            "font-size": 18
                                        }
                                    }
                                ],
                                "style": {
                                    "display": "flex",
                                    "justifyContent": "center",
                                    "alignItems": "center",
                                    "height": 200
                                }
                            }
                        ]
                    },
                    {
                        "keep-dict-unrendered": true,
                        "title": "步骤2",
                        "subTitle": "上传数据",
                        "description": [
                            {
                                "component": "fac.AntdDivider",
                                "children": "上传数据"
                            },
                            {
                                "component": "fac.AntdDraggerUpload",
                                "id": "upload-raw-data",
                                "apiUrl": "/upload/",
                                "fileMaxSize": 10,
                                "fileTypes": [
                                    "csv",
                                    "xls",
                                    "xlsx"
                                ],
                                "text": "请上传csv, xls或xlsx文件",
                                "hint": "选择Axes对象后,点击或拖拽文件至此处进行上传。",
                                "showUploadList": false,
                                "disabled": true
                            },
                            {
                                "component": "fac.AntdTable",
                                "id": "upload-raw-data-table"
                            }
                        ]
                    },
                    {
                        "keep-dict-unrendered": true,
                        "title": "步骤3",
                        "subTitle": "计算统计量",
                        "description": [
                            {
                                "component": "fac.AntdDivider",
                                "children": "计算统计量"
                            },
                            {
                                "component": "fac.AntdSpace",
                                "children": [
                                    {
                                        "component": "html.Div",
                                        "children": [
                                            {
                                                "component": "fac.AntdDivider",
                                                "children": "选择结局变量和自变量",
                                                "innerTextOrientation": "left"
                                            }
                                        ],
                                        "style": {
                                            "width": 1000
                                        }
                                    },
                                    {
                                        "component": "fac.AntdSelect",
                                        "options": null,
                                        "placeholder": "选择结局变量(二分类因变量)",
                                        "id": "outcome-variable",
                                        "style": {
                                            "width": 600
                                        }
                                    },
                                    {
                                        "component": "fac.AntdTransfer",
                                        "titles": [
                                            "候选自变量",
                                            "选定自变量"
                                        ],
                                        "dataSource": null,
                                        "targetKeys": null,
                                        "showSearch": true,
                                        "operations": [
                                            "放入",
                                            "移出"
                                        ],
                                        "id": "independent-variable",
                                        "height": 600,
                                        "style": {
                                            "width": 600
                                        }
                                    },
                                    {
                                        "component": "fac.AntdSelect",
                                        "id": "fit-model",
                                        "placeholder": "选择学习模型",
                                        "options": [
                                            {
                                                "keep-dict-unrendered": true,
                                                "label": "逻辑回归",
                                                "value": "LogisticRegression"
                                            },
                                            {
                                                "keep-dict-unrendered": true,
                                                "label": "随机森林",
                                                "value": "RandomForestClassifier"
                                            }
                                        ],
                                        "style": {
                                            "width": 200
                                        }
                                    },
                                    {
                                        "component": "fac.AntdButton",
                                        "children": "计算统计量",
                                        "id": "calculate-statistics",
                                        "autoSpin": true,
                                        "type": "primary",
                                        "icon": [
                                            {
                                                "component": "fac.AntdIcon",
                                                "icon": "md-layers"
                                            }
                                        ]
                                    },
                                    {
                                        "component": "html.Div",
                                        "children": [
                                            {
                                                "component": "fac.AntdDivider",
                                                "children": "计算结果",
                                                "innerTextOrientation": "left"
                                            }
                                        ],
                                        "style": {
                                            "width": 1000
                                        }
                                    },
                                    {
                                        "component": "html.Div",
                                        "id": "calculated-statistical-result",
                                        "children": []
                                    }
                                ],
                                "direction": "vertical",
                                "style": {
                                    "display": "flex",
                                    "justifyContent": "center",
                                    "alignItems": "center"
                                }
                            }
                        ]
                    },
                    {
                        "keep-dict-unrendered": true,
                        "title": "步骤4",
                        "subTitle": "设定图层参数",
                        "description": [
                            {
                                "component": "fac.AntdDivider",
                                "children": "图层参数"
                            },
                            {
                                "component": "fac.AntdSpace",
                                "children": [
                                    {
                                        "component": "fac.AntdSpace",
                                        "children": [
                                            {
                                                "component": "html.Div",
                                                "children": [
                                                    {
                                                        "component": "fac.AntdDivider",
                                                        "children": "图片格式",
                                                        "innerTextOrientation": "left"
                                                    }
                                                ],
                                                "style": {
                                                    "width": 1000
                                                }
                                            },
                                            {
                                                "component": "fac.AntdSelect",
                                                "id": {
                                                    "type": "update-plot-params-value",
                                                    "index": "theme-style"
                                                },
                                                "options": "f(generate_attr_dict_from_str_list, str_list = plt.style.available, dict_keys = ['label', 'value'])",
                                                "placeholder": "选择主题",
                                                "style": {
                                                    "width": 300
                                                }
                                            }
                                        ],
                                        "direction": "vertical"
                                    },
                                    {
                                        "component": "fac.AntdSpace",
                                        "id": "roc-ax-params",
                                        "style": {
                                            "display": "none"
                                        },
                                        "children": [
                                            {
                                                "component": "html.Div",
                                                "children": [
                                                    {
                                                        "component": "fac.AntdDivider",
                                                        "children": "ROC图层参数",
                                                        "innerTextOrientation": "left"
                                                    }
                                                ],
                                                "style": {
                                                    "width": 1000
                                                }
                                            },
                                            {
                                                "component": "fac.AntdSpace",
                                                "children": [
                                                    {
                                                        "component": "fac.AntdText",
                                                        "children": "颜色",
                                                        "keyboard": true,
                                                        "style": {
                                                            "font-size": 18
                                                        }
                                                    },
                                                    {
                                                        "component": "fac.AntdButton",
                                                        "id": {
                                                            "type": "open-color-palette",
                                                            "index": "roc"
                                                        },
                                                        "children": "调色板",
                                                        "type": "primary",
                                                        "icon": [
                                                            {
                                                                "component": "fac.AntdIcon",
                                                                "icon": "md-layers"
                                                            }
                                                        ]
                                                    },
                                                    {
                                                        "component": "fac.AntdModal",
                                                        "id": {
                                                            "type": "custom-color-picker",
                                                            "index": "roc"
                                                        },
                                                        "children": [
                                                            {
                                                                "component": "fac.AntdSpace",
                                                                "children": [
                                                                    {
                                                                        "component": "fuc.FefferyWheelColorPicker",
                                                                        "id": {
                                                                            "type": "color-wheel-selector",
                                                                            "index": "roc"
                                                                        }
                                                                    },
                                                                    {
                                                                        "component": "html.Div",
                                                                        "id": {
                                                                            "type": "wheel-color-div",
                                                                            "index": "roc"
                                                                        },
                                                                        "style": {
                                                                            "width": "200px",
                                                                            "height": "200px",
                                                                            "display": "flex",
                                                                            "alignItems": "center",
                                                                            "justifyContent": "center",
                                                                            "borderRadius'": "5px",
                                                                            "boxShadow": "0px 0px 12px rgba(0, 0, 0, .12)",
                                                                            "transition": "0.25s",
                                                                            "backround": "#fffc51"
                                                                        }
                                                                    },
                                                                    {
                                                                        "component": "fuc.FefferyTwitterColorPicker",
                                                                        "id": {
                                                                            "type": "color-twitter-selector",
                                                                            "index": "roc"
                                                                        },
                                                                        "colors": [
                                                                            "#fff4ce",
                                                                            "#797673",
                                                                            "#fed9cc",
                                                                            "#d83b01",
                                                                            "#fde7e9",
                                                                            "#a80000",
                                                                            "#dff6dd",
                                                                            "#107c10"
                                                                        ]
                                                                    }
                                                                ]
                                                            }
                                                        ],
                                                        "title": "选择自定义颜色",
                                                        "renderFooter": true,
                                                        "width": 800
                                                    },
                                                    {
                                                        "component": "fac.AntdSelect",
                                                        "id": {
                                                            "type": "custom-color-selector",
                                                            "index": "roc"
                                                        },
                                                        "defaultValue": "#1864ab",
                                                        "options": [
                                                            {
                                                                "keep-dict-unrendered": true,
                                                                "label": "自定义色",
                                                                "value": "#1864ab",
                                                                "colors": [
                                                                    "#1864ab"
                                                                ]
                                                            }
                                                        ],
                                                        "colorsMode": "diverging",
                                                        "disabled": false,
                                                        "style": {
                                                            "width": 200
                                                        }
                                                    },
                                                    {
                                                        "component": "fac.AntdSelect",
                                                        "defaultValue": "配色1",
                                                        "options": [
                                                            {
                                                                "keep-dict-unrendered": true,
                                                                "label": "配色1",
                                                                "value": "配色1",
                                                                "colors": [
                                                                    "#fff5f5",
                                                                    "#ff8787",
                                                                    "#c92a2a"
                                                                ]
                                                            },
                                                            {
                                                                "keep-dict-unrendered": true,
                                                                "label": "配色2",
                                                                "value": "配色2",
                                                                "colors": [
                                                                    "#f8f0fc",
                                                                    "#da77f2",
                                                                    "#862e9c"
                                                                ]
                                                            },
                                                            {
                                                                "keep-dict-unrendered": true,
                                                                "label": "配色3",
                                                                "value": "配色3",
                                                                "colors": [
                                                                    "#e7f5ff",
                                                                    "#4dabf7",
                                                                    "#1864ab"
                                                                ]
                                                            }
                                                        ],
                                                        "colorsMode": "diverging",
                                                        "style": {
                                                            "width": 200
                                                        }
                                                    },
                                                    {
                                                        "component": "fac.AntdSelect",
                                                        "defaultValue": "RGB1",
                                                        "options": [
                                                            {
                                                                "keep-dict-unrendered": true,
                                                                "group": "RGB",
                                                                "options": [
                                                                    {
                                                                        "keep-dict-unrendered": true,
                                                                        "label": "颜色1",
                                                                        "value": "RGB1",
                                                                        "colors": [
                                                                            "#fff5f5"
                                                                        ]
                                                                    },
                                                                    {
                                                                        "keep-dict-unrendered": true,
                                                                        "label": "颜色2",
                                                                        "value": "RGB2",
                                                                        "colors": [
                                                                            "#ff8787"
                                                                        ]
                                                                    },
                                                                    {
                                                                        "keep-dict-unrendered": true,
                                                                        "label": "颜色3",
                                                                        "value": "RGB3",
                                                                        "colors": [
                                                                            "#c92a2a"
                                                                        ]
                                                                    }
                                                                ]
                                                            },
                                                            {
                                                                "keep-dict-unrendered": true,
                                                                "group": "HEX",
                                                                "options": [
                                                                    {
                                                                        "keep-dict-unrendered": true,
                                                                        "label": "颜色1",
                                                                        "value": "HEX1",
                                                                        "colors": [
                                                                            "#f8f0fc"
                                                                        ]
                                                                    },
                                                                    {
                                                                        "keep-dict-unrendered": true,
                                                                        "label": "颜色2",
                                                                        "value": "HEX2",
                                                                        "colors": [
                                                                            "#da77f2"
                                                                        ]
                                                                    },
                                                                    {
                                                                        "keep-dict-unrendered": true,
                                                                        "label": "颜色3",
                                                                        "value": "HEX3",
                                                                        "colors": [
                                                                            "#862e9c"
                                                                        ]
                                                                    }
                                                                ]
                                                            }
                                                        ],
                                                        "colorsMode": "diverging",
                                                        "style": {
                                                            "width": 200
                                                        }
                                                    }
                                                ]
                                            },
                                            {
                                                "component": "fac.AntdSpace",
                                                "children": [
                                                    {
                                                        "component": "fac.AntdText",
                                                        "children": "曲线平滑度",
                                                        "keyboard": true,
                                                        "style": {
                                                            "font-size": 18,
                                                            "marginTop": "10px"
                                                        }
                                                    },
                                                    {
                                                        "component": "fac.AntdCheckbox",
                                                        "id": {
                                                            "type": "update-plot-params-check",
                                                            "index": "smooth-line"
                                                        },
                                                        "label": "平滑",
                                                        "style": {
                                                            "marginTop": "10px"
                                                        }
                                                    }
                                                ]
                                            },
                                            {
                                                "component": "fac.AntdSpace",
                                                "children": [
                                                    {
                                                        "component": "fac.AntdText",
                                                        "children": "线条样式",
                                                        "keyboard": true,
                                                        "style": {
                                                            "font-size": 18
                                                        }
                                                    },
                                                    {
                                                        "component": "fac.AntdInputNumber",
                                                        "min": 0.5,
                                                        "step": 0.1,
                                                        "max": 5,
                                                        "defaultValue": 1,
                                                        "id": {
                                                            "type": "update-plot-params-value",
                                                            "index": "line-width-roc"
                                                        },
                                                        "addonBefore": "线条粗细",
                                                        "prefix": [
                                                            {
                                                                "component": "fac.AntdIcon",
                                                                "icon": "antd-control"
                                                            }
                                                        ],
                                                        "style": {
                                                            "marginTop": "10px"
                                                        }
                                                    }
                                                ]
                                            }
                                        ],
                                        "direction": "vertical"
                                    },
                                    {
                                        "component": "fac.AntdSpace",
                                        "id": "diagonal-ax-params",
                                        "style": {
                                            "display": "none"
                                        },
                                        "children": [
                                            {
                                                "component": "html.Div",
                                                "children": [
                                                    {
                                                        "component": "fac.AntdDivider",
                                                        "children": "对角线图层参数",
                                                        "innerTextOrientation": "left"
                                                    }
                                                ],
                                                "style": {
                                                    "width": 1000
                                                }
                                            },
                                            {
                                                "component": "fac.AntdSpace",
                                                "children": [
                                                    {
                                                        "component": "fac.AntdText",
                                                        "children": "颜色",
                                                        "keyboard": true,
                                                        "style": {
                                                            "font-size": 18
                                                        }
                                                    },
                                                    {
                                                        "component": "fac.AntdButton",
                                                        "id": {
                                                            "type": "open-color-palette",
                                                            "index": "diagonal"
                                                        },
                                                        "children": "调色板",
                                                        "type": "primary",
                                                        "icon": [
                                                            {
                                                                "component": "fac.AntdIcon",
                                                                "icon": "md-layers"
                                                            }
                                                        ]
                                                    },
                                                    {
                                                        "component": "fac.AntdModal",
                                                        "id": {
                                                            "type": "custom-color-picker",
                                                            "index": "diagonal"
                                                        },
                                                        "children": [
                                                            {
                                                                "component": "fac.AntdSpace",
                                                                "children": [
                                                                    {
                                                                        "component": "fuc.FefferyWheelColorPicker",
                                                                        "id": {
                                                                            "type": "color-wheel-selector",
                                                                            "index": "diagonal"
                                                                        }
                                                                    },
                                                                    {
                                                                        "component": "html.Div",
                                                                        "id": {
                                                                            "type": "wheel-color-div",
                                                                            "index": "diagonal"
                                                                        },
                                                                        "style": {
                                                                            "width": "200px",
                                                                            "height": "200px",
                                                                            "display": "flex",
                                                                            "alignItems": "center",
                                                                            "justifyContent": "center",
                                                                            "borderRadius'": "5px",
                                                                            "boxShadow": "0px 0px 12px rgba(0, 0, 0, .12)",
                                                                            "transition": "0.25s",
                                                                            "backround": "#fffc51"
                                                                        }
                                                                    },
                                                                    {
                                                                        "component": "fuc.FefferyTwitterColorPicker",
                                                                        "id": {
                                                                            "type": "color-twitter-selector",
                                                                            "index": "diagonal"
                                                                        },
                                                                        "colors": [
                                                                            "#fff4ce",
                                                                            "#797673",
                                                                            "#fed9cc",
                                                                            "#d83b01",
                                                                            "#fde7e9",
                                                                            "#a80000",
                                                                            "#dff6dd",
                                                                            "#107c10"
                                                                        ]
                                                                    }
                                                                ]
                                                            }
                                                        ],
                                                        "title": "选择自定义颜色",
                                                        "renderFooter": true,
                                                        "width": 800
                                                    },
                                                    {
                                                        "component": "fac.AntdSelect",
                                                        "id": {
                                                            "type": "custom-color-selector",
                                                            "index": "diagonal"
                                                        },
                                                        "defaultValue": "#1864ab",
                                                        "options": [
                                                            {
                                                                "keep-dict-unrendered": true,
                                                                "label": "自定义色",
                                                                "value": "#1864ab",
                                                                "colors": [
                                                                    "#1864ab"
                                                                ]
                                                            }
                                                        ],
                                                        "colorsMode": "diverging",
                                                        "disabled": false,
                                                        "style": {
                                                            "width": 200
                                                        }
                                                    },
                                                    {
                                                        "component": "fac.AntdSelect",
                                                        "defaultValue": "配色1",
                                                        "options": [
                                                            {
                                                                "keep-dict-unrendered": true,
                                                                "label": "配色1",
                                                                "value": "配色1",
                                                                "colors": [
                                                                    "#fff5f5",
                                                                    "#ff8787",
                                                                    "#c92a2a"
                                                                ]
                                                            },
                                                            {
                                                                "keep-dict-unrendered": true,
                                                                "label": "配色2",
                                                                "value": "配色2",
                                                                "colors": [
                                                                    "#f8f0fc",
                                                                    "#da77f2",
                                                                    "#862e9c"
                                                                ]
                                                            },
                                                            {
                                                                "keep-dict-unrendered": true,
                                                                "label": "配色3",
                                                                "value": "配色3",
                                                                "colors": [
                                                                    "#e7f5ff",
                                                                    "#4dabf7",
                                                                    "#1864ab"
                                                                ]
                                                            }
                                                        ],
                                                        "colorsMode": "diverging",
                                                        "style": {
                                                            "width": 200
                                                        }
                                                    },
                                                    {
                                                        "component": "fac.AntdSelect",
                                                        "defaultValue": "RGB1",
                                                        "options": [
                                                            {
                                                                "keep-dict-unrendered": true,
                                                                "group": "RGB",
                                                                "options": [
                                                                    {
                                                                        "keep-dict-unrendered": true,
                                                                        "label": "颜色1",
                                                                        "value": "RGB1",
                                                                        "colors": [
                                                                            "#fff5f5"
                                                                        ]
                                                                    },
                                                                    {
                                                                        "keep-dict-unrendered": true,
                                                                        "label": "颜色2",
                                                                        "value": "RGB2",
                                                                        "colors": [
                                                                            "#ff8787"
                                                                        ]
                                                                    },
                                                                    {
                                                                        "keep-dict-unrendered": true,
                                                                        "label": "颜色3",
                                                                        "value": "RGB3",
                                                                        "colors": [
                                                                            "#c92a2a"
                                                                        ]
                                                                    }
                                                                ]
                                                            },
                                                            {
                                                                "keep-dict-unrendered": true,
                                                                "group": "HEX",
                                                                "options": [
                                                                    {
                                                                        "keep-dict-unrendered": true,
                                                                        "label": "颜色1",
                                                                        "value": "HEX1",
                                                                        "colors": [
                                                                            "#f8f0fc"
                                                                        ]
                                                                    },
                                                                    {
                                                                        "keep-dict-unrendered": true,
                                                                        "label": "颜色2",
                                                                        "value": "HEX2",
                                                                        "colors": [
                                                                            "#da77f2"
                                                                        ]
                                                                    },
                                                                    {
                                                                        "keep-dict-unrendered": true,
                                                                        "label": "颜色3",
                                                                        "value": "HEX3",
                                                                        "colors": [
                                                                            "#862e9c"
                                                                        ]
                                                                    }
                                                                ]
                                                            }
                                                        ],
                                                        "colorsMode": "diverging",
                                                        "style": {
                                                            "width": 200
                                                        }
                                                    }
                                                ]
                                            },
                                            {
                                                "component": "fac.AntdSpace",
                                                "children": [
                                                    {
                                                        "component": "fac.AntdText",
                                                        "children": "线条样式",
                                                        "keyboard": true,
                                                        "style": {
                                                            "font-size": 18
                                                        }
                                                    },
                                                    {
                                                        "component": "fac.AntdInputNumber",
                                                        "id": {
                                                            "type": "update-plot-params-value",
                                                            "index": "line-width-diagonal"
                                                        },
                                                        "addonBefore": "线条粗细",
                                                        "prefix": [
                                                            {
                                                                "component": "fac.AntdIcon",
                                                                "icon": "antd-control"
                                                            }
                                                        ],
                                                        "min": 0.5,
                                                        "step": 0.1,
                                                        "max": 5,
                                                        "defaultValue": 1,
                                                        "style": {
                                                            "marginTop": "10px"
                                                        }
                                                    }
                                                ]
                                            }
                                        ],
                                        "direction": "vertical"
                                    }
                                ],
                                "direction": "vertical",
                                "style": {
                                    "display": "flex",
                                    "justifyContent": "left",
                                    "alignItems": "center"
                                }
                            }
                        ]
                    },
                    {
                        "keep-dict-unrendered": true,
                        "title": "步骤5",
                        "subTitle": "作图",
                        "description": [
                            {
                                "component": "fac.AntdDivider",
                                "children": "作图"
                            },
                            {
                                "component": "fac.AntdSpace",
                                "children": [
                                    {
                                        "component": "html.Div",
                                        "children": [
                                            {
                                                "component": "fac.AntdDivider",
                                                "children": "选择图片布局",
                                                "innerTextOrientation": "left"
                                            }
                                        ],
                                        "style": {
                                            "width": 1000
                                        }
                                    },
                                    {
                                        "component": "fac.AntdCheckCardGroup",
                                        "children": [
                                            {
                                                "component": "fac.AntdCheckCard",
                                                "children": "1行1列",
                                                "value": "1r1c",
                                                "size": "small"
                                            },
                                            {
                                                "component": "fac.AntdCheckCard",
                                                "children": "1行2列",
                                                "value": "1r2c",
                                                "size": "small"
                                            },
                                            {
                                                "component": "fac.AntdCheckCard",
                                                "children": "2行1列",
                                                "value": "2r1c",
                                                "size": "small"
                                            },
                                            {
                                                "component": "fac.AntdCheckCard",
                                                "children": "2行2列",
                                                "value": "2r2c",
                                                "size": "small"
                                            }
                                        ],
                                        "defaultValue": "1r1c"
                                    },
                                    {
                                        "component": "html.Div",
                                        "children": [
                                            {
                                                "component": "fac.AntdDivider",
                                                "children": "选择图层",
                                                "innerTextOrientation": "left"
                                            }
                                        ],
                                        "style": {
                                            "width": 1000
                                        }
                                    },
                                    {
                                        "component": "fac.AntdCascader",
                                        "id": "plot-axes-cascader",
                                        "placeholder": "选择图层对象",
                                        "options": [
                                            {
                                                "keep-dict-unrendered": true,
                                                "label": "图片-1",
                                                "value": "图片-1",
                                                "children": [
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-1",
                                                        "value": "ROC-1"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-2",
                                                        "value": "ROC-2"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-3",
                                                        "value": "ROC-3"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-4",
                                                        "value": "ROC-4"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "对角线",
                                                        "value": "对角线"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "箱形图",
                                                        "value": "箱形图"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "热图",
                                                        "value": "热图"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "坐标轴",
                                                        "value": "坐标轴"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "图注",
                                                        "value": "图注"
                                                    }
                                                ]
                                            },
                                            {
                                                "keep-dict-unrendered": true,
                                                "label": "图片-2",
                                                "value": "图片-2",
                                                "children": [
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-1",
                                                        "value": "ROC-1"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-2",
                                                        "value": "ROC-2"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-3",
                                                        "value": "ROC-3"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-4",
                                                        "value": "ROC-4"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "对角线",
                                                        "value": "对角线"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "箱形图",
                                                        "value": "箱形图"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "热图",
                                                        "value": "热图"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "坐标轴",
                                                        "value": "坐标轴"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "图注",
                                                        "value": "图注"
                                                    }
                                                ]
                                            },
                                            {
                                                "keep-dict-unrendered": true,
                                                "label": "图片-3",
                                                "value": "图片-3",
                                                "children": [
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-1",
                                                        "value": "ROC-1"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-2",
                                                        "value": "ROC-2"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-3",
                                                        "value": "ROC-3"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-4",
                                                        "value": "ROC-4"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "对角线",
                                                        "value": "对角线"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "箱形图",
                                                        "value": "箱形图"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "热图",
                                                        "value": "热图"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "坐标轴",
                                                        "value": "坐标轴"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "图注",
                                                        "value": "图注"
                                                    }
                                                ]
                                            },
                                            {
                                                "keep-dict-unrendered": true,
                                                "label": "图片-4",
                                                "value": "图片-4",
                                                "children": [
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-1",
                                                        "value": "ROC-1"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-2",
                                                        "value": "ROC-2"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-3",
                                                        "value": "ROC-3"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "ROC-4",
                                                        "value": "ROC-4"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "对角线",
                                                        "value": "对角线"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "箱形图",
                                                        "value": "箱形图"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "热图",
                                                        "value": "热图"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "坐标轴",
                                                        "value": "坐标轴"
                                                    },
                                                    {
                                                        "keep-dict-unrendered": true,
                                                        "label": "图注",
                                                        "value": "图注"
                                                    }
                                                ]
                                            }
                                        ],
                                        "multiple": true
                                    },
                                    {
                                        "component": "fac.AntdButton",
                                        "id": "generate-plot",
                                        "children": "生成图片",
                                        "type": "primary",
                                        "icon": [
                                            {
                                                "component": "fac.AntdIcon",
                                                "icon": "md-layers"
                                            }
                                        ],
                                        "style": {
                                            "marginTop": "100px"
                                        }
                                    }
                                ],
                                "direction": "vertical",
                                "style": {
                                    "display": "flex",
                                    "justifyContent": "left",
                                    "alignItems": "center",
                                    "height": 400
                                }
                            }
                        ]
                    },
                    {
                        "keep-dict-unrendered": true,
                        "title": "步骤6",
                        "subTitle": "图片展示",
                        "description": [
                            {
                                "component": "fac.AntdDivider",
                                "children": "画廊"
                            },
                            {
                                "component": "fac.AntdSpace",
                                "children": [
                                    {
                                        "component": "html.Div",
                                        "children": [
                                            {
                                                "component": "fac.AntdDivider",
                                                "children": "当前图片",
                                                "innerTextOrientation": "left"
                                            }
                                        ],
                                        "style": {
                                            "width": 1000
                                        }
                                    },
                                    {
                                        "component": "html.Div",
                                        "children": [
                                            {
                                                "component": "fac.AntdImage",
                                                "id": "statical-single-plot",
                                                "src": null,
                                                "height": 600
                                            }
                                        ]
                                    },
                                    {
                                        "component": "html.Div",
                                        "children": [
                                            {
                                                "component": "fac.AntdDivider",
                                                "children": "历史图片",
                                                "innerTextOrientation": "left"
                                            }
                                        ],
                                        "style": {
                                            "width": 1000
                                        }
                                    },
                                    {
                                        "component": "html.Div",
                                        "children": [
                                            {
                                                "component": "fac.AntdImage",
                                                "id": {
                                                    "type": "image",
                                                    "index": "display-multiple-plots"
                                                },
                                                "src": [],
                                                "multiImageMode": "unfold",
                                                "height": 160
                                            }
                                        ]
                                    }
                                ],
                                "direction": "vertical",
                                "style": {
                                    "display": "flex",
                                    "justifyContent": "left",
                                    "alignItems": "center"
                                }
                            }
                        ]
                    }
                ],
                "direction": "vertical",
                "allowClick": true
            }
        ],
        "style": {
            "margin": "50px 50px 50px 50px"
        }
    },
    "mytools": [
        {
            "function-tag": "由字符列表生成属性值字典,如AntdSelect的options,AntdTable的columns",
            "function-name": "generate_attr_dict_from_str_list",
            "function-arguments": {
                "args": [
                    "str_list:list",
                    "dict_keys:list"
                ]
            },
            "function-body": "key1, key2 = dict_keys\nattr_dict = [\n    {key1: ele, key2: ele}\n     for ele in str_list\n]\nreturn attr_dict\n"
        },
        {
            "function-tag": "将整个页面的部件的组织结构解析成路径和对应的值,并查找目标值的路径",
            "function-name": "traverse_json_path_value",
            "function-arguments": {
                "args": [
                    "data"
                ],
                "kwargs": {
                    "path": "",
                    "path_value_dict": null
                }
            },
            "dependencies": [
                "pandas@pd",
                "json"
            ],
            "function-body": "if path_value_dict is None:\n  path_value_dict = {'Path': [], 'Value': []}\n\nif isinstance(data, dict):\n    for key, value in data.items():\n        new_path = f\"{path}.{key}\" if path else key\n        traverse_json_path_value(value, new_path, path_value_dict)\nelif isinstance(data, list):\n    for index, item in enumerate(data):\n        new_path = f\"{path}[{index}]\"\n        traverse_json_path_value(item, new_path, path_value_dict)\nelse:\n    path_value_dict['Path'].append(path)\n    path_value_dict['Value'].append(data)\n\n# 每个循环均保存,会导致速度减慢\n\n# pd.DataFrame(path_value_dict).to_csv('static/session/path_value_dict.csv', index = False)\n\nreturn pd.DataFrame(path_value_dict)\n"
        },
        {
            "function-tag": "递归地查找JSON对象中指定键名的所有路径",
            "function-name": "find_paths",
            "function-arguments": {
                "args": [
                    "json_obj",
                    "target_key"
                ],
                "kwargs": {
                    "current_path": "",
                    "paths": []
                }
            },
            "returns": "所有找到的路径列表",
            "function-body": "if isinstance(json_obj, dict):\n    for key, value in json_obj.items():\n        if key == target_key:\n            paths.append((current_path + '.' + key).strip('.'))\n        if isinstance(value, dict) or isinstance(value, list):\n            find_paths(value, target_key, current_path + '.' + key, paths)\nelif isinstance(json_obj, list):\n    for index, value in enumerate(json_obj):\n        find_paths(value, target_key, current_path + '.' + str(index), paths)\nreturn paths\n"
        },
        {
            "function-tag": "将路径列表转换为级联选项时的中间函数,用于添加节点",
            "function-name": "add_node",
            "function-arguments": {
                "args": [
                    "tree",
                    "path"
                ]
            },
            "returns": "无返回值",
            "function-body": "current_node = tree\nfor node in path:\n    found = False\n    for child in current_node['children']:\n        if child['value'] == node:\n            current_node = child\n            found = True\n            break\n    if not found:\n        new_node = {'value': node, 'label': node, 'children': []}\n        current_node['children'].append(new_node)\n        current_node = new_node\n"
        },
        {
            "function-tag": "将路径转换为级联选项",
            "function-name": "paths_to_options",
            "function-arguments": {
                "args": [
                    "paths"
                ]
            },
            "function-body": "options = []\nfor path in paths:\n    nodes = path.split('.')\n    if not options:\n        options.append({'value': nodes[0], 'label': nodes[0], 'children': []})\n    else:\n        add_node(options[0], nodes)\nreturn options\n"
        },
        {
            "function-tag": "查找键名,并将查找到的路径转换为级联选项的高阶函数",
            "function-name": "find_json_key_paths_to_cascader_options",
            "function-arguments": {
                "args": [
                    "json_data",
                    "target_key"
                ]
            },
            "function-body": "json_paths = find_paths(json_data, target_key)\nif json_paths:\n  cascader_options = paths_to_options(json_paths)\nelse:\n  cascader_options = []\nreturn cascader_options\n"
        },
        {
            "function-tag": "按json路径取值,若没有则返回None",
            "function-name": "get_json_value",
            "function-arguments": {
                "args": [
                    "json_data",
                    "path"
                ]
            },
            "function-body": "keys = path.split('.')\nvalue = json_data\nfor key in keys:\n    if isinstance(value, dict) and key in value:\n        value = value[key]\n    else:\n        return None\nreturn value\n"
        },
        {
            "function-tag": "按json路径赋值,若没有则新建",
            "function-name": "set_json_value",
            "function-arguments": {
                "args": [
                    "json_data",
                    "path",
                    "value"
                ]
            },
            "returns": "没有返回值,直接使用方法即可",
            "function-body": "keys = path.split('.')\ncurrent = json_data\nfor key in keys[:-1]:\n    if key not in current:\n        current[key] = {}\n    current = current[key]\ncurrent[keys[-1]] = value\n"
        },
        {
            "function-tag": "提取值为0或1的列,作为结局变量",
            "function-name": "extract_binary_columns",
            "function-arguments": {
                "args": [
                    "df"
                ]
            },
            "function-body": "binary_columns = []\nfor column in df.columns:\n    if df[column].dtype == 'int64' or df[column].dtype == 'float64':\n        if df[column].dropna().isin([0, 1]).all():\n            binary_columns.append(column)\nreturn binary_columns\n"
        },
        {
            "function-tag": "将回调数据字典写入服务端json文件,如果文件已存在则更新后写入",
            "function-name": "json_io",
            "function-arguments": {
                "args": [
                    "io"
                ],
                "kwargs": {
                    "json_data": null
                }
            },
            "dependencies": [
                "json",
                "os"
            ],
            "function-body": "json_file = 'static/dict/plot-params.json'\nif io == 'w': \n  with open(json_file, \"w\", encoding = 'utf8') as jf:\n    json.dump(json_data, jf, ensure_ascii = False, indent = 4)\nelse:\n  with open(json_file, \"r\", encoding = 'utf8') as jf:\n    json_data = json.load(jf)\n    return json_data\n"
        },
        {
            "function-tag": "获取roc相关的统计数据,如每个观测值对应的sens, seps,以及auc,ci等",
            "function-name": "calculate_roc_stat",
            "function-arguments": {
                "args": [
                    "json_data",
                    "model",
                    "df",
                    "response:str",
                    "independence:list"
                ],
                "unlimited-kwargs": true
            },
            "returns": "roc相关的一些招标",
            "dependencies": [
                "sklearn.metrics@metrics",
                "sklearn.linear_model|LogisticRegression"
            ],
            "function-body": "y_train = df[response]\nX_train = df[independence]\n\n# 模型拟合\nmodel.fit(X_train, y_train)\n## 计算每个阈值的fpr和tpr\nprobs = model.predict_proba(X_train) # 这里应该是X_test,由于没有测试集,用X_train代替验证\npreds = probs[:,1]  # 预测的probabilty\nfpr, tpr, threshold = metrics.roc_curve(y_train, preds)\n\n\n## 计算auc\nroc_auc = metrics.auc(fpr, tpr)\nauc, auc_cov, ci = calculate_auc_ci(y_train, preds)\n\nreturn fpr, tpr, threshold, auc, auc_cov, ci\n"
        },
        {
            "function-tag": "根据作图参数的json生成图片",
            "function-name": "smart_plot_from_params_json",
            "function-arguments": {
                "args": [
                    "params_json"
                ]
            },
            "returns": "图片的路径",
            "dependencies": [
                "matplotlib.pyplot@plt",
                "uuid|uuid4",
                "seaborn@sb"
            ],
            "function-body": "# 获取参数\n\nfig_axes_path = get_json_value(params_json, 'plot-fig-axes-path')\ncurrent_fig_path = get_json_value(params_json, 'current-fig')\ntheme_style = get_json_value(params_json, f'{current_fig_path}.theme-style')\nif not theme_style:\n  theme_style = 'default'\n\n# 重置样式\nplt.rcdefaults()\nplt.style.use(theme_style)\n\n\nfig, ax = plt.subplots()\n\nfor ax_path in fig_axes_path:\n  ## roc\n  if 'roc' in ax_path.lower():\n    x_y_csv = get_json_value(params_json, f'{ax_path}.data-params.x-y-csv')\n    df = pd.read_csv(x_y_csv)\n\n    # 是否平滑曲线\n    smooth = get_json_value(params_json, f'{ax_path}.plot-params.args.smooth')\n    if smooth:\n      df = df.rolling(window=2).mean().fillna(0)\n\n\n    fpr = df.iloc[:, 0].values\n    tpr = df.iloc[:, 1].values\n    args = [fpr, tpr]\n    kwargs = get_json_value(params_json, f'{ax_path}.plot-params.kwargs')\n    ax.plot(*args, **kwargs)\n\n  ## 对角线\n  if '对角线' in ax_path.lower():\n    kwargs = get_json_value(params_json, f'{ax_path}.plot-params.kwargs')\n    ax.plot([0, 1], [0, 1], **kwargs)\n\n## 保存图片\nimg_save_path = f\"static/session/{str(uuid4())}.jpeg\"\nfig.savefig(img_save_path, dpi = 600)\n\nplt.close()\n\n## 将图片路径保存至params_json\nparams_json = json_io('r')\nset_json_value(params_json, f\"{current_fig_path}.img-save-path\", img_save_path)\njson_io('w', params_json)\n\n\nreturn img_save_path\n"
        },
        {
            "function-tag": "计算auc及其方差和ci",
            "function-name": "calculate_auc_ci",
            "function-arguments": {
                "args": [
                    "y_true",
                    "y_pred"
                ],
                "kwargs": {
                    "alpha": 0.95
                }
            },
            "dependencies": [
                "scipy|stats",
                "numpy@np"
            ],
            "function-body": "auc, auc_cov = delong_roc_variance(y_true, y_pred)\n\nauc_std = np.sqrt(auc_cov)\nlower_upper_q = np.abs(np.array([0, 1]) - (1 - alpha) / 2)\nci = stats.norm.ppf(\n    lower_upper_q,\n    loc=auc,\n    scale=auc_std)\n\nci[ci > 1] = 1\nci[ci < 0] = 0\nreturn auc, auc_cov, ci\n"
        },
        {
            "function-tag": "Computes ROC AUC variance for a single set of predictions",
            "function-name": "delong_roc_variance",
            "function-arguments": {
                "args": [
                    "ground_truth",
                    "predictions"
                ],
                "kwargs": {
                    "sample_weight": null
                }
            },
            "dependencies": [
                "numpy@np"
            ],
            "function-body": "order, label_1_count, ordered_sample_weight = compute_ground_truth_statistics(\n  ground_truth, sample_weight)\npredictions_sorted_transposed = predictions[np.newaxis, order]\naucs, delongcov = fastDeLong(predictions_sorted_transposed, label_1_count, ordered_sample_weight)\nassert len(aucs) == 1, \"There is a bug in the code, please forward this to the developers\"\nreturn aucs[0], delongcov\n"
        },
        {
            "function-tag": "计算ground_truth_statistics,具体是什么,暂不清楚",
            "function-name": "compute_ground_truth_statistics",
            "function-arguments": {
                "args": [
                    "ground_truth",
                    "sample_weight"
                ]
            },
            "function-body": "assert np.array_equal(np.unique(ground_truth), [0, 1])\norder = (-ground_truth).argsort()\nlabel_1_count = int(ground_truth.sum())\nif sample_weight is None:\n    ordered_sample_weight = None\nelse:\n    ordered_sample_weight = sample_weight[order]\n\nreturn order, label_1_count, ordered_sample_weight\n"
        },
        {
            "function-tag": "计算auc的方差",
            "function-name": "fastDeLong",
            "function-arguments": {
                "args": [
                    "predictions_sorted_transposed",
                    "label_1_count",
                    "sample_weight"
                ]
            },
            "function-body": "if sample_weight is None:\n    return fastDeLong_no_weights(predictions_sorted_transposed, label_1_count)\nelse:\n    return fastDeLong_weights(predictions_sorted_transposed, label_1_count, sample_weight)\n"
        },
        {
            "function-tag": "The fast version of DeLong's method for computing the covariance of unadjusted AUC.",
            "function-name": "fastDeLong_weights",
            "function-arguments": {
                "args": [
                    "predictions_sorted_transposed",
                    "label_1_count",
                    "sample_weight"
                ]
            },
            "returns": [
                "AUC value",
                "DeLong covariance"
            ],
            "reference": "@article{sun2014fast,\n  title={Fast Implementation of DeLong's Algorithm for\n        Comparing the Areas Under Correlated Receiver Oerating Characteristic Curves},\n  author={Xu Sun and Weichao Xu},\n  journal={IEEE Signal Processing Letters},\n  volume={21},\n  number={11},\n  pages={1389--1393},\n  year={2014},\n  publisher={IEEE}\n}\n",
            "function-body": "# Short variables are named as they are in the paper\nm = label_1_count\nn = predictions_sorted_transposed.shape[1] - m\npositive_examples = predictions_sorted_transposed[:, :m]\nnegative_examples = predictions_sorted_transposed[:, m:]\nk = predictions_sorted_transposed.shape[0]\n\ntx = np.empty([k, m], dtype=float)\nty = np.empty([k, n], dtype=float)\ntz = np.empty([k, m + n], dtype=float)\nfor r in range(k):\n    tx[r, :] = compute_midrank_weight(positive_examples[r, :], sample_weight[:m])\n    ty[r, :] = compute_midrank_weight(negative_examples[r, :], sample_weight[m:])\n    tz[r, :] = compute_midrank_weight(predictions_sorted_transposed[r, :], sample_weight)\ntotal_positive_weights = sample_weight[:m].sum()\ntotal_negative_weights = sample_weight[m:].sum()\npair_weights = np.dot(sample_weight[:m, np.newaxis], sample_weight[np.newaxis, m:])\ntotal_pair_weights = pair_weights.sum()\naucs = (sample_weight[:m]*(tz[:, :m] - tx)).sum(axis=1) / total_pair_weights\nv01 = (tz[:, :m] - tx[:, :]) / total_negative_weights\nv10 = 1. - (tz[:, m:] - ty[:, :]) / total_positive_weights\nsx = np.cov(v01)\nsy = np.cov(v10)\ndelongcov = sx / m + sy / n\nreturn aucs, delongcov\n"
        },
        {
            "function-tag": "The fast version of DeLong's method for computing the covariance of unadjusted AUC, without weights.",
            "function-name": "fastDeLong_no_weights",
            "function-arguments": {
                "args": [
                    "predictions_sorted_transposed",
                    "label_1_count"
                ]
            },
            "returns": "AUC value, DeLong covariance",
            "reference": "@article{sun2014fast,\n  title={Fast Implementation of DeLong's Algorithm for\n        Comparing the Areas Under Correlated Receiver Oerating Characteristic Curves},\n  author={Xu Sun and Weichao Xu},\n  journal={IEEE Signal Processing Letters},\n  volume={21},\n  number={11},\n  pages={1389--1393},\n  year={2014},\n  publisher={IEEE}\n}\n",
            "function-body": "# Short variables are named as they are in the paper\nm = label_1_count\nn = predictions_sorted_transposed.shape[1] - m\npositive_examples = predictions_sorted_transposed[:, :m]\nnegative_examples = predictions_sorted_transposed[:, m:]\nk = predictions_sorted_transposed.shape[0]\n\ntx = np.empty([k, m], dtype=float)\nty = np.empty([k, n], dtype=float)\ntz = np.empty([k, m + n], dtype=float)\nfor r in range(k):\n    tx[r, :] = compute_midrank(positive_examples[r, :])\n    ty[r, :] = compute_midrank(negative_examples[r, :])\n    tz[r, :] = compute_midrank(predictions_sorted_transposed[r, :])\naucs = tz[:, :m].sum(axis=1) / m / n - float(m + 1.0) / 2.0 / n\nv01 = (tz[:, :m] - tx[:, :]) / n\nv10 = 1.0 - (tz[:, m:] - ty[:, :]) / m\nsx = np.cov(v01)\nsy = np.cov(v10)\ndelongcov = sx / m + sy / n\nreturn aucs, delongcov\n"
        },
        {
            "function-tag": "Computes midranks. AUC comparison adapted from https://github.com/Netflix/vmaf/",
            "function-name": "compute_midrank",
            "function-arguments": {
                "args": [
                    "x"
                ]
            },
            "returns": "array of midranks",
            "function-body": "J = np.argsort(x)\nZ = x[J]\nN = len(x)\nT = np.zeros(N, dtype=float)\ni = 0\nwhile i < N:\n    j = i\n    while j < N and Z[j] == Z[i]:\n        j += 1\n    T[i:j] = 0.5*(i + j - 1)\n    i = j\nT2 = np.empty(N, dtype=float)\n# Note(kazeevn) +1 is due to Python using 0-based indexing\n# instead of 1-based in the AUC formula in the paper\nT2[J] = T + 1\nreturn T2\n"
        },
        {
            "function-tag": "Computes midranks. AUC comparison adapted from https://github.com/Netflix/vmaf/",
            "function-name": "compute_midrank_weight",
            "function-arguments": {
                "args": [
                    "x",
                    "sample_weight"
                ]
            },
            "returns": "array of midranks",
            "function-body": "J = np.argsort(x)\nZ = x[J]\ncumulative_weight = np.cumsum(sample_weight[J])\nN = len(x)\nT = np.zeros(N, dtype=float)\ni = 0\nwhile i < N:\n    j = i\n    while j < N and Z[j] == Z[i]:\n        j += 1\n    T[i:j] = cumulative_weight[i:j].mean()\n    i = j\nT2 = np.empty(N, dtype=float)\nT2[J] = T\nreturn T2\n"
        }
    ],
    "callback": [
        {
            "function-tag": "上传数据服务",
            "decorator": {
                "decorator-name": "app.server.route",
                "decorator-arguments": {
                    "kwargs": {
                        "rule": "/upload/",
                        "methods": [
                            "POST"
                        ]
                    }
                }
            },
            "function-name": "upload_file",
            "function-arguments": {
                "kwargs": {
                    "upload_dir": "static/upload",
                    "upload_backup_dir": "static/upload_backup"
                }
            },
            "dependencies": [
                "os",
                "shutil",
                "flask|request"
            ],
            "function-body": "# 获取上传id参数,用于指向保存路径\nuploadId = request.values.get('uploadId')\n\n\n# 获取上传的文件名称\nfilename = request.files['file'].filename\n\n# 创建文件夹\nif not os.path.exists(f'{upload_dir}/{uploadId}'): # 同一个上传组件同一个会话的uploadId是一样的\n    os.makedirs(f'{upload_dir}/{uploadId}')\n\n# 流式写出文件到指定目录\nfilePath =f'{upload_dir}/{uploadId}/{filename}'\n\nif os.path.exists(filePath): # 如果存在的话则备份,防止被覆盖\n\n    src_path = filePath\n    dst_path = f'{upload_backup_dir}/{uuid4()}-{filename}'\n    if not os.path.exists(dst_path):\n        os.makedirs(dst_path)\n\n\n    shutil.copy(src_path, dst_path)\n\nwith open(filePath, 'wb') as f:\n    # 流式写出大型文件,这里的10代表10MB\n    for chunk in iter(lambda: request.files['file'].read(1024 * 1024 * 10), b''):\n        f.write(chunk)\nreturn filePath\n"
        },
        {
            "function-tag": "选择图层时",
            "decorator": {
                "decorator-name": "callback",
                "decorator-arguments": {
                    "args": [
                        {
                            "Output": {
                                "id": "current-ax",
                                "prop": "children"
                            }
                        },
                        {
                            "Output": {
                                "id": "upload-raw-data",
                                "prop": "disabled",
                                "allow_duplicate": true
                            }
                        },
                        {
                            "Output": {
                                "id": "outcome-variable",
                                "prop": "value",
                                "allow_duplicate": true
                            }
                        },
                        {
                            "Output": {
                                "id": "independent-variable",
                                "prop": "dataSource",
                                "allow_duplicate": true
                            }
                        },
                        {
                            "Output": {
                                "id": "independent-variable",
                                "prop": "targetKeys",
                                "allow_duplicate": true
                            }
                        },
                        {
                            "Output": {
                                "id": "plot-axes-cascader",
                                "prop": "options",
                                "allow_duplicate": true
                            }
                        },
                        {
                            "Output": {
                                "id": "roc-ax-params",
                                "prop": "style"
                            }
                        },
                        {
                            "Output": {
                                "id": "diagonal-ax-params",
                                "prop": "style"
                            }
                        },
                        {
                            "Input": {
                                "id": "fig-axes-cascader",
                                "prop": "value"
                            }
                        }
                    ],
                    "kwargs": {
                        "prevent_initial_call": true
                    }
                }
            },
            "function-name": "show_current_ax",
            "function-arguments": {
                "args": [
                    "fig_axes_cascader_value"
                ]
            },
            "dependencies": [
                "dash|Output+Input"
            ],
            "function-body": "print(\"\\n\\n第一步:选择图层\")\nprint(f\"{fig_axes_cascader_value=}\")\n\ncurrent_ax_children, upload_raw_data_disabled, \\\noutcome_variable_value, independent_variable_datasource, independent_variable_targetkeys, \\\nplot_axes_cascader_options = [dash.no_update] * 6\n\nroc_ax_params_style,  diagonal_ax_params_style = [{'display':'none'}] * 2\n\nparams_json = json_io('r')\n\nif fig_axes_cascader_value:\n  current_ax_children = \" > \".join(fig_axes_cascader_value)\n  params_json['current-fig'], params_json['current-ax'] = fig_axes_cascader_value\nelse:\n  current_ax_children = ''\n\n# 激活上传按钮\nupload_raw_data_disabled = False\n\n# 将当前图层的json_path保存至params-json\n\nparams_json['current-ax-path'] = \".\".join(fig_axes_cascader_value) if current_ax_children else ''\n\n\njson_io('w', params_json)\n\n\n\n\n# 显示相应图层参数的界面\nprint(f\"{current_ax_children=}\")\nif \"roc\" in current_ax_children.lower():\n  roc_ax_params_style = {'display':'block'}\nelif \"对角线\" in current_ax_children.lower():\n  diagonal_ax_params_style = {'display':'block'}\nelse:\n  pass\n\n# 初始化结局变量的value和自变量的targetKeys\noutcome_variable_value = None\nindependent_variable_datasource = []\nindependent_variable_targetkeys = []\n\nreturn current_ax_children, upload_raw_data_disabled, \\\noutcome_variable_value, independent_variable_datasource, independent_variable_targetkeys, \\\nplot_axes_cascader_options, \\\nroc_ax_params_style, diagonal_ax_params_style\n"
        },
        {
            "function-tag": "上传文件时",
            "decorator": {
                "decorator-name": "callback",
                "decorator-arguments": {
                    "args": [
                        {
                            "Output": {
                                "id": "upload-raw-data-table",
                                "prop": "data"
                            }
                        },
                        {
                            "Output": {
                                "id": "upload-raw-data-table",
                                "prop": "columns"
                            }
                        },
                        {
                            "Output": {
                                "id": "outcome-variable",
                                "prop": "options",
                                "allow_duplicate": true
                            }
                        },
                        {
                            "Output": {
                                "id": "outcome-variable",
                                "prop": "value",
                                "allow_duplicate": true
                            }
                        },
                        {
                            "Input": {
                                "id": "upload-raw-data",
                                "prop": "lastUploadTaskRecord"
                            }
                        }
                    ],
                    "kwargs": {
                        "prevent_initial_call": true
                    }
                }
            },
            "function-name": "manage_upload_raw_data",
            "function-arguments": {
                "args": [
                    "upload_raw_data_lastuploadtaskrecord"
                ]
            },
            "dependencies": [
                "dash|Output+Input"
            ],
            "function-body": "print(\"\\n\\n第二步:上传数据\")\n\nupload_raw_data_table_data, upload_raw_data_table_columns, \\\noutcome_variable_options, outcome_variable_value = [dash.no_update] * 4\n\nfile_name = upload_raw_data_lastuploadtaskrecord['fileName']\nuploadfilePath = f\"{upload_dir}/{upload_raw_data_lastuploadtaskrecord['taskId']}/{file_name}\"\nif file_name.endswith('xlsx'):\n  df = pd.read_excel(uploadfilePath, engine = 'openpyxl')\nelif file_name.endswith('xls') :\n    df = pd.read_excel(uploadfilePath, engine = 'xlrd')\nelif file_name.endswith('csv'):\n    df = pd.read_csv(uploadfilePath)\n  \nupload_raw_data_table_data = df.to_dict('records')\nupload_raw_data_table_columns = generate_attr_dict_from_str_list(str_list = df.columns, dict_keys = ['title', 'dataIndex'])\n\n# 初始化结局变量的options\n## 提取值为0,1这样的列\nbinary_columns = extract_binary_columns(df)\noutcome_variable_options = generate_attr_dict_from_str_list(str_list = binary_columns, dict_keys = ['label', 'value'])\n\n\n\n  \n# 初始化自变量的datasource\nindependent_variable_datasource = generate_attr_dict_from_str_list(str_list = df.columns, dict_keys = ['key', 'title'])\n\n\n\n# 更新params-json\nparams_json = json_io('r')\ncurrent_ax_path = params_json['current-ax-path']\nset_json_value(params_json, f\"{current_ax_path}.data-params.raw-data-file-path\", uploadfilePath)\nset_json_value(params_json, f\"{current_ax_path}.data-params.df-columns\", list(df.columns))\njson_io('w', params_json)\n\n\nreturn upload_raw_data_table_data, upload_raw_data_table_columns, \\\noutcome_variable_options, outcome_variable_value\n"
        },
        {
            "function-tag": "选择结局变量时",
            "decorator": {
                "decorator-name": "callback",
                "decorator-arguments": {
                    "args": [
                        {
                            "Output": {
                                "id": "independent-variable",
                                "prop": "dataSource",
                                "allow_duplicate": true
                            }
                        },
                        {
                            "Output": {
                                "id": "independent-variable",
                                "prop": "targetKeys",
                                "allow_duplicate": true
                            }
                        },
                        {
                            "Input": {
                                "id": "outcome-variable",
                                "prop": "value"
                            }
                        },
                        {
                            "State": {
                                "id": "independent-variable",
                                "prop": "targetKeys"
                            }
                        }
                    ],
                    "kwargs": {
                        "prevent_initial_call": true
                    }
                }
            },
            "function-name": "select_outcome_variable",
            "function-arguments": {
                "args": [
                    "outcome_variable",
                    "independent_variable_targetkeys_state"
                ]
            },
            "dependencies": [
                "dash|Output+Input"
            ],
            "function-body": "print(f\"\\n选择结局变量\")\nindependent_variable_datasource, independent_variable_targetkeys = [dash.no_update] * 2\n\n\nparams_json = json_io('r')\nif outcome_variable:\n  set_json_value(params_json, f\"{params_json['current-ax-path']}.data-params.outcome-variable\", outcome_variable)\n  df_columns = get_json_value(params_json, f\"{params_json['current-ax-path']}.data-params.df-columns\")\n  # 更新自变量的dataSource\n  independent_variable_datasource = [{'key': col, 'title': col} for col in df_columns if col != outcome_variable] \n\n# 更新自变量的targetKeys\nif independent_variable_targetkeys_state:\n  independent_variable_targetkeys = [targetkey for targetkey in independent_variable_targetkeys_state if targetkey != outcome_variable]\n  set_json_value(params_json, f\"{params_json['current-ax-path']}.data-params.independent-variable\", independent_variable_targetkeys)\n\n\njson_io('w', params_json)\n\nreturn independent_variable_datasource, independent_variable_targetkeys\n"
        },
        {
            "function-tag": "自变量穿梭时",
            "decorator": {
                "decorator-name": "callback",
                "decorator-arguments": {
                    "args": [
                        {
                            "Output": {
                                "id": "message-container",
                                "prop": "children",
                                "allow_duplicate": true
                            }
                        },
                        {
                            "Input": {
                                "id": "independent-variable",
                                "prop": "targetKeys"
                            }
                        }
                    ],
                    "kwargs": {
                        "prevent_initial_call": true
                    }
                }
            },
            "function-name": "select_outcome_variable",
            "function-arguments": {
                "args": [
                    "independent_variable"
                ]
            },
            "dependencies": [
                "dash|Output+Input"
            ],
            "function-body": "print(f\"\\n自变量穿梭\")\nmessage_container_children = dash.no_update\n\nparams_json = json_io('r')\nset_json_value(params_json, f\"{params_json['current-ax-path']}.data-params.independent-variable\", independent_variable)\njson_io('w', params_json)\n"
        },
        {
            "function-tag": "计算统计量时",
            "decorator": {
                "decorator-name": "callback",
                "decorator-arguments": {
                    "args": [
                        {
                            "Output": {
                                "id": "calculated-statistical-result",
                                "prop": "children",
                                "allow_duplicate": true
                            }
                        },
                        {
                            "Output": {
                                "id": "calculate-statistics",
                                "prop": "loading"
                            }
                        },
                        {
                            "Input": {
                                "id": "calculate-statistics",
                                "prop": "nClicks"
                            }
                        },
                        {
                            "State": {
                                "id": "fit-model",
                                "prop": "value"
                            }
                        }
                    ],
                    "kwargs": {
                        "prevent_initial_call": true
                    }
                }
            },
            "function-name": "calculate_statitics",
            "function-arguments": {
                "args": [
                    "calculate_statistics_click",
                    "fit_model_name"
                ]
            },
            "dependencies": [
                "sklearn.ensemble|RandomForestClassifier",
                "sklearn.linear_model|LogisticRegression",
                "dash|State"
            ],
            "function-body": "calculated_statistical_result_children = dash.no_update\n\nif calculate_statistics_click:\n  print(f\"\\n计算统计量\")\n  # 拟合模型\n  model_dict = {\n    'LogisticRegression' : LogisticRegression(),\n    'RandomForestClassifier' : RandomForestClassifier()\n  }\n\n  model = model_dict.get(fit_model_name)\n\n  ## 数据源\n  params_json = json_io('r')\n  data_file_json_path = f\"{params_json['current-ax-path']}.data-params.raw-data-file-path\"\n  data_file = get_json_value(params_json, data_file_json_path)\n  \n  ## 读取数据,后期可包装成函数\n  if data_file.endswith('xlsx'):\n    df = pd.read_excel(data_file, engine = 'openpyxl')\n  elif data_file.endswith('xls') :\n      df = pd.read_excel(data_file, engine = 'xlrd')\n  elif data_file.endswith('csv'):\n      df = pd.read_csv(data_file)\n\n  # 响应变量\n  response = get_json_value(params_json, f\"{params_json['current-ax-path']}.data-params.outcome-variable\")\n  \n  # 自变量\n  independence = get_json_value(params_json, f\"{params_json['current-ax-path']}.data-params.independent-variable\")\n\n  # 计算相关roc数据\n  fpr, tpr, threshold, auc, auc_cov, ci = calculate_roc_stat(params_json, model, df, response, independence)\n\n  calculated_statistical_result_children = f\"AUC={auc}, 95%CI={ci}\"\n\n\n  # 保存数据至csv\n\n  x_y = pd.DataFrame({'fpr': fpr, 'tpr':tpr})\n  x_y_csv= f'static/session/x-y_{str(uuid4())}.csv'\n  x_y.to_csv(x_y_csv, index = False)\n\n  auc_stat = pd.DataFrame({'auc': auc, 'auc_cov': auc_cov, 'ci': ci})\n  auc_stat_csv = f'static/session/auc-stat_{str(uuid4())}.csv'\n  auc_stat.to_csv(auc_stat_csv, index = False)\n\n  params_json = json_io('r')\n  set_json_value(params_json, f\"{params_json['current-ax-path']}.data-params.x-y-csv\", x_y_csv)\n  set_json_value(params_json, f\"{params_json['current-ax-path']}.data-params.auc-stat-csv\", auc_stat_csv)\n  json_io('w', params_json)\n  \n\ncalculate_statistics_loading = False\n\nreturn calculated_statistical_result_children, calculate_statistics_loading\n"
        },
        {
            "function-tag": "选择样式",
            "decorator": {
                "decorator-name": "callback",
                "decorator-arguments": {
                    "args": [
                        {
                            "Output": {
                                "id": "statical-single-plot",
                                "prop": "src",
                                "allow_duplicate": true
                            }
                        },
                        {
                            "Input": {
                                "id": {
                                    "type": "update-plot-params-value",
                                    "index": "theme-style"
                                },
                                "prop": "value"
                            }
                        }
                    ],
                    "kwargs": {
                        "prevent_initial_call": true
                    }
                }
            },
            "function-name": "select_theme_style",
            "function-arguments": {
                "args": [
                    "theme_style_value"
                ]
            },
            "dependencies": [
                "dash|Output+Input"
            ],
            "function-body": "print(f\"选择样式时\")\n\nstatical_single_plot_src = dash.no_update\n\nparams_json = json_io('r')\n\nset_json_value(params_json, f'{params_json['current-fig']}.theme-style', theme_style_value)\n\njson_io('w', params_json)\n\nreturn statical_single_plot_src\n"
        },
        {
            "function-tag": "打开调色板",
            "decorator": {
                "decorator-name": "callback",
                "decorator-arguments": {
                    "args": [
                        {
                            "Output": {
                                "id": {
                                    "type": "custom-color-picker",
                                    "index": "MATCH"
                                },
                                "prop": "visible"
                            }
                        },
                        {
                            "Input": {
                                "id": {
                                    "type": "open-color-palette",
                                    "index": "MATCH"
                                },
                                "prop": "nClicks"
                            }
                        }
                    ],
                    "kwargs": {
                        "prevent_initial_call": true
                    }
                }
            },
            "function-name": "open_custom_color_palette",
            "function-arguments": {
                "args": [
                    "open_color_palette_button_click"
                ]
            },
            "dependencies": [
                "dash|Output+Input+MATCH"
            ],
            "function-body": "print(f\"打开调色板时\")\n\ncustom_color_picker_visible = dash.no_update\ncustom_color_picker_visible = True\n\n\nreturn custom_color_picker_visible\n"
        },
        {
            "function-tag": "调色板颜色回调至自定义色",
            "decorator": {
                "decorator-name": "callback",
                "decorator-arguments": {
                    "args": [
                        {
                            "Output": {
                                "id": {
                                    "type": "custom-color-selector",
                                    "index": "MATCH"
                                },
                                "prop": "value"
                            }
                        },
                        {
                            "Output": {
                                "id": {
                                    "type": "custom-color-selector",
                                    "index": "MATCH"
                                },
                                "prop": "options"
                            }
                        },
                        {
                            "Output": {
                                "id": {
                                    "type": "wheel-color-div",
                                    "index": "MATCH"
                                },
                                "prop": "style"
                            }
                        },
                        {
                            "Output": {
                                "id": {
                                    "type": "wheel-color-div",
                                    "index": "MATCH"
                                },
                                "prop": "children"
                            }
                        },
                        {
                            "Input": {
                                "id": {
                                    "type": "color-wheel-selector",
                                    "index": "MATCH"
                                },
                                "prop": "color"
                            }
                        },
                        {
                            "Input": {
                                "id": {
                                    "type": "color-twitter-selector",
                                    "index": "MATCH"
                                },
                                "prop": "color"
                            }
                        },
                        {
                            "Input": {
                                "id": {
                                    "type": "custom-color-selector",
                                    "index": "MATCH"
                                },
                                "prop": "value"
                            }
                        },
                        {
                            "State": {
                                "id": {
                                    "type": "custom-color-selector",
                                    "index": "MATCH"
                                },
                                "prop": "options"
                            }
                        },
                        {
                            "State": {
                                "id": {
                                    "type": "wheel-color-div",
                                    "index": "MATCH"
                                },
                                "prop": "style"
                            }
                        }
                    ],
                    "kwargs": {
                        "prevent_initial_call": true
                    }
                }
            },
            "function-name": "select_custom_color",
            "function-arguments": {
                "args": [
                    "selected_wheel_color",
                    "selected_twitter_color",
                    "custom_color_selector_value_state",
                    "custom_color_selector_options_state",
                    "wheel_color_div_style_state"
                ]
            },
            "dependencies": [
                "dash|Output+Input+MATCH"
            ],
            "function-body": "# @jhzac69867347\n# @lmixb53518435\n# @tanghuaxilie\n\ntrigger = dash.callback_context.triggered\nprint(f\"\\n\\n{dash.callback_context.triggered=}\")\n# print(f\"{dash.callback_context.triggered_prop_ids=}\")\n\ntriggered_prop_id = dash.callback_context.triggered[0]['prop_id']\n\nprint(f\"\\n\\n{triggered_prop_id=}\")\n\ncustom_color_selector_value, custom_color_selector_options, wheel_color_div_style, \\\nwheel_color_div_children  = [dash.no_update] * 4\n\n# wheel color\nif json.loads(triggered_prop_id.rsplit(\".\")[0])['type'] == \"color-wheel-selector\":\n  print(f\"\\n\\n选择转盘颜色\")\n  wheel_color = dash.callback_context.triggered[0]['value']\n  \n\n  # 构建新的颜色选择项\n  custom_color_options_added = {\n      'label': wheel_color,\n      'value': wheel_color,\n      'colors': [wheel_color]\n  }\n  \n  # 颜色显示区\n  wheel_color_div_children = wheel_color\n\n  wheel_color_div_style_state['background'] = wheel_color\n  wheel_color_div_style = wheel_color_div_style_state\n\n  # 自定义颜色选择框\n  if custom_color_options_added not in custom_color_selector_options_state: # 防止重复添加\n    custom_color_selector_options = [custom_color_options_added, *custom_color_selector_options_state]\n  custom_color_selector_value = wheel_color\n\n  # 写入params_json\n  params_json = json_io('r')\n  set_json_value(params_json, f\"{params_json['current-ax-path']}.plot-params.kwargs.color\", wheel_color)\n  json_io('w', params_json)\n\n\nelif json.loads(triggered_prop_id.rsplit(\".\")[0])['type'] == \"color-twitter-selector\":\n  print(f\"\\n\\n选择twitter颜色\")\n  twitter_color = dash.callback_context.triggered[0]['value']\n  \n\n  # 构建新的颜色选择项\n  custom_color_options_added = {\n      'label': twitter_color,\n      'value': twitter_color,\n      'colors': [twitter_color]\n  }\n\n \n  \n  # 颜色显示区\n  wheel_color_div_children = twitter_color\n\n  wheel_color_div_style_state['background'] = twitter_color\n  wheel_color_div_style = wheel_color_div_style_state\n\n  # 自定义颜色选择框\n  if custom_color_options_added not in custom_color_selector_options_state: # 防止重复添加\n    custom_color_selector_options = [custom_color_options_added, *custom_color_selector_options_state]\n  custom_color_selector_value = twitter_color\n\n  # 写入params_json\n  params_json = json_io('r')\n  set_json_value(params_json, f\"{params_json['current-ax-path']}.plot-params.kwargs.color\", twitter_color)\n  json_io('w', params_json)\n\nelif json.loads(triggered_prop_id.rsplit(\".\")[0])['type'] == \"custom-color-selector\":\n  print(f\"\\n\\n选择自定义颜色\")\n\n  # 写入params_json\n  ## 由于wheel-color的自发性,导致有一个自发的回调,导致乱写入json文件,这时要控制有条件地写入\n  params_json = json_io('r')\n  if params_json.get('current-ax-path'): \n    set_json_value(params_json, f\"{params_json['current-ax-path']}.plot-params.kwargs.color\", custom_color_selector_value_state)\n    json_io('w', params_json)\n\n\nreturn custom_color_selector_value, custom_color_selector_options, wheel_color_div_style, \\\nwheel_color_div_children\n"
        },
        {
            "function-tag": "选择作图图层",
            "decorator": {
                "decorator-name": "callback",
                "decorator-arguments": {
                    "args": [
                        {
                            "Output": {
                                "id": "message-container",
                                "prop": "children",
                                "allow_duplicate": true
                            }
                        },
                        {
                            "Input": {
                                "id": "plot-axes-cascader",
                                "prop": "value"
                            }
                        }
                    ],
                    "kwargs": {
                        "prevent_initial_call": true
                    }
                }
            },
            "function-name": "select_plot_fig_axes",
            "function-arguments": {
                "args": [
                    "plot_fig_axes_value"
                ]
            },
            "dependencies": [
                "dash|Output+Input+MATCH"
            ],
            "function-body": "print(\"\\n\\n选择作图图层\")\nmessage_container_children = dash.no_update\nif plot_fig_axes_value:\n  print(f\"{plot_fig_axes_value=}\")\n  plot_fig_axes_path = [\".\".join(plot_fig_ax) for plot_fig_ax in plot_fig_axes_value]\n\n  # 写入params_json\n  params_json = json_io('r')\n  set_json_value(params_json, 'plot-fig-axes-path', plot_fig_axes_path)\n  json_io('w', params_json)\n\n\nreturn message_container_children\n"
        },
        {
            "function-tag": "作图",
            "decorator": {
                "decorator-name": "callback",
                "decorator-arguments": {
                    "args": [
                        {
                            "Output": {
                                "id": "statical-single-plot",
                                "prop": "src",
                                "allow_duplicate": true
                            }
                        },
                        {
                            "Output": {
                                "id": "message-container",
                                "prop": "children",
                                "allow_duplicate": true
                            }
                        },
                        {
                            "Input": {
                                "id": "generate-plot",
                                "prop": "nClicks"
                            }
                        }
                    ],
                    "kwargs": {
                        "prevent_initial_call": true
                    }
                }
            },
            "function-name": "plot",
            "function-arguments": {
                "args": [
                    "generate_plot_click"
                ]
            },
            "dependencies": [
                "dash|Output+Input"
            ],
            "function-body": "print(f\"\\n\\n开始作图\")\n\nstatical_single_plot_src, message_container_children = [dash.no_update] * 2\n\nparams_json = json_io('r')\n\nif params_json['plot-fig-axes-path']: # 设置了作图路径才更新图片\n  statical_single_plot_src = smart_plot_from_params_json(params_json)\nelse:\n  message_container_children = fac.AntdMessage(\n    content='请选择作图图层',\n    type='error'\n  )\n\n\nreturn statical_single_plot_src, message_container_children\n"
        },
        {
            "function-tag": "参数改变后,自动更新图",
            "decorator": {
                "decorator-name": "callback",
                "decorator-arguments": {
                    "args": [
                        {
                            "Output": {
                                "id": "statical-single-plot",
                                "prop": "src",
                                "allow_duplicate": true
                            }
                        },
                        {
                            "Output": {
                                "id": "message-container",
                                "prop": "children",
                                "allow_duplicate": true
                            }
                        },
                        {
                            "Input": {
                                "id": {
                                    "type": "update-plot-params-check",
                                    "index": "ALL"
                                },
                                "prop": "checked"
                            }
                        },
                        {
                            "Input": {
                                "id": {
                                    "type": "custom-color-selector",
                                    "index": "ALL"
                                },
                                "prop": "value"
                            }
                        },
                        {
                            "Input": {
                                "id": {
                                    "type": "update-plot-params-value",
                                    "index": "ALL"
                                },
                                "prop": "value"
                            }
                        }
                    ],
                    "kwargs": {
                        "prevent_initial_call": true
                    }
                }
            },
            "function-name": "update_plot",
            "function-arguments": {
                "args": [
                    "update_plot_params_check",
                    "custom_selected_color",
                    "update_plot_params_value"
                ]
            },
            "dependencies": [
                "dash|Output+Input+ALL"
            ],
            "function-body": "trigger = dash.callback_context.triggered\nprint(f\"激活callback的对象为:{trigger=}\")\nplot_param_prop_id = json.loads(trigger[0].get('prop_id').rsplit('.')[0])\nprint(f\"prop.id为:{plot_param_prop_id=}\")\n\n\nstatical_single_plot_src, message_container_children = [dash.no_update] * 2\n# 更新图片的样式\nif plot_param_prop_id == {'index': 'theme-style', 'type': 'update-plot-params-value'}:\n  print(f\"\\n\\n更新图片样式\")\n  updated_param = trigger[0]['value']\n  params_json = json_io('r')\n  set_json_value(params_json, f\"{params_json['current-ax-path']}.theme-style\", updated_param)\n  json_io('w', params_json)\n\n# 更新ROC平滑参数\nif plot_param_prop_id == {'index': 'smooth-line', 'type': 'update-plot-params-check'}:\n  print(f\"\\n\\n更新ROC平滑参数\")\n  updated_param = trigger[0]['value']\n\n  params_json = json_io('r')\n  set_json_value(params_json, f\"{params_json['current-ax-path']}.plot-params.args.smooth\", updated_param)\n  json_io('w', params_json)\n\n# 更新ROC线条粗细\nif plot_param_prop_id == {'index': 'line-width-roc', 'type': 'update-plot-params-value'}:\n  print(f\"\\n\\n更新ROC线条粗细\")  \n  updated_param = trigger[0]['value']\n\n  params_json = json_io('r')\n  set_json_value(params_json, f\"{params_json['current-ax-path']}.plot-params.kwargs.linewidth\", updated_param)\n  json_io('w', params_json)\n\n\n# 更新对角线条粗细\nif plot_param_prop_id == {'index': 'line-width-diagonal', 'type': 'update-plot-params-value'}:\n  print(f\"\\n\\n更新对角线线条粗细\")  \n  updated_param = trigger[0]['value']\n\n  params_json = json_io('r')\n  set_json_value(params_json, f\"{params_json['current-ax-path']}.plot-params.kwargs.linewidth\", updated_param)\n  json_io('w', params_json)\n\n\n \n\n\n\n\n\n\n\n\nparams_json = json_io('r')\n\nif params_json['plot-fig-axes-path']: # 设置了作图图层才更新图片\n  statical_single_plot_src = smart_plot_from_params_json(params_json)\n# else:\n#   message_container_children = fac.AntdMessage(\n#     content='如果要实时参数更新效果,请选择作图图层',\n#     type='warning'\n#   )\n\n\nreturn statical_single_plot_src, message_container_children\n"
        }
    ]
}

10.8.3 渲染成dash app代码

10.8.3.1 汇总import 部分

暂时不渲染

# 汇总import 部分
import_statements = yaml_data['import']
import_statements
{'dash': ['flask|request+session',
  'dash',
  'dash|html+Output+Input+callback',
  'feffery_antd_components@fac',
  'feffery_utils_components@fuc'],
 'data': ['pandas@pd'],
 'plot': ['matplotlib.pyplot@plt', 'matplotlib'],
 'file': ['os', 'shutil'],
 'text': ['uuid|uuid4']}
# 汇总所有import实体

import_package_list = []


for package_category, imports in import_statements.items():
    import_package_list.extend(imports)


print('\n'.join(import_package_list))
flask|request+session
dash
dash|html+Output+Input+callback
feffery_antd_components@fac
feffery_utils_components@fuc
pandas@pd
matplotlib.pyplot@plt
matplotlib
os
shutil
uuid|uuid4

10.8.3.2 渲染app设置部分

# 渲染app设置部分
app_setting_statements = yaml_data['app-setting']
app_setting_statements
{'app = dash.Dash': {'__name__': 'single-key',
  'suppress_callback_exceptions': True,
  'update_title': None},
 'app.server.secret_key': 'statitcal-plot',
 'app.server.static_folder': 'static',
 'app.title': 'ROC PLOT',
 'matplotlib.use': '(Agg)',
 'upload_dir': 'static/upload'}
rendered_statement_app_setting = []


for setting_name, setting_value in app_setting_statements.items():
    # 如果setting_value是字符
    if isinstance(setting_value, str):
        print(f"setting_value是字符.{setting_name=}, {setting_value=}")
        ## 如果setting_value=='single-key'
        if setting_value == '()':
            rendered_statement = f"{setting_name}{setting_value}"
            
        elif '(' in setting_value:
            setting_value_rendered = repr(setting_value.strip('()'))
            rendered_statement = f"{setting_name}({setting_value_rendered})"
        ## 如果setting_value为括号形式
        else:
             rendered_statement = f"{setting_name} = {repr(setting_value)}"
        
    elif isinstance(setting_value, dict):
        print(f"setting_value是字典.{setting_name=}, {setting_value=}")
        rendered_dict_attributes_list = []
        for attr_name, attr_value in setting_value.items():
            if isinstance(attr_value, str) : # 
                print(f"setting_value的attr_value是字符.{setting_value=}, {attr_value=}")
                if attr_value=='single-key':
                    rendered_dict_attributes = attr_name
                else:
                    rendered_dict_attributes = f"{attr_name} = {repr(attr_value)}"
            else:
                print(f"setting_value的attr_value是其他.{setting_value=}, {attr_value=}")
                rendered_dict_attributes = f"{attr_name} = {attr_value}"

            rendered_dict_attributes_list.append(rendered_dict_attributes)
        
        rendered_statement =  f"{setting_name}({', '.join(rendered_dict_attributes_list)})"
          
    else:
        print(f"setting_value是其他.{setting_name=}, {setting_value=}")
        pass

                        
    rendered_statement_app_setting.append(rendered_statement)

print('\n'.join(rendered_statement_app_setting))
setting_value是字典.setting_name='app = dash.Dash', setting_value={'__name__': 'single-key', 'suppress_callback_exceptions': True, 'update_title': None}
setting_value的attr_value是字符.setting_value={'__name__': 'single-key', 'suppress_callback_exceptions': True, 'update_title': None}, attr_value='single-key'
setting_value的attr_value是其他.setting_value={'__name__': 'single-key', 'suppress_callback_exceptions': True, 'update_title': None}, attr_value=True
setting_value的attr_value是其他.setting_value={'__name__': 'single-key', 'suppress_callback_exceptions': True, 'update_title': None}, attr_value=None
setting_value是字符.setting_name='app.server.secret_key', setting_value='statitcal-plot'
setting_value是字符.setting_name='app.server.static_folder', setting_value='static'
setting_value是字符.setting_name='app.title', setting_value='ROC PLOT'
setting_value是字符.setting_name='matplotlib.use', setting_value='(Agg)'
setting_value是字符.setting_name='upload_dir', setting_value='static/upload'
app = dash.Dash(__name__, suppress_callback_exceptions = True, update_title = None)
app.server.secret_key = 'statitcal-plot'
app.server.static_folder = 'static'
app.title = 'ROC PLOT'
matplotlib.use('Agg')
upload_dir = 'static/upload'

10.8.3.3 渲染作图参数部分

params_statements = yaml_data['params']


with open("plot-params.json", 'w', encoding='utf-8') as f:
    json.dump(params_statements, f, ensure_ascii = False, indent=4)

print(f"作图参数json数据已成功写入。")
作图参数json数据已成功写入。

10.8.3.4 渲染layout部分

# 渲染layout部分
layout_statements = yaml_data['layout']

layout_statements
{'component': 'html.Div',
 'id': {'type': 'main-container-div', 'index': 'heihei'},
 'children': [{'component': 'html.Div',
   'children': None,
   'id': 'message-container'},
  {'component': 'fac.AntdSteps',
   'steps': [{'keep-dict-unrendered': True,
     'title': '步骤1',
     'subTitle': '选择图层',
     'description': [{'component': 'fac.AntdDivider', 'children': '图层'},
      {'component': 'fac.AntdSpace',
       'children': [{'component': 'fac.AntdCascader',
         'id': 'fig-axes-cascader',
         'placeholder': '选择图层对象',
         'expandTrigger': 'hover',
         'options': [{'keep-dict-unrendered': True,
           'label': '图片-1',
           'value': '图片-1',
           'children': [{'keep-dict-unrendered': True,
             'label': 'ROC-1',
             'value': 'ROC-1'},
            {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'},
            {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'},
            {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'},
            {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'},
            {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'},
            {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'},
            {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'},
            {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]},
          {'keep-dict-unrendered': True,
           'label': '图片-2',
           'value': '图片-2',
           'children': [{'keep-dict-unrendered': True,
             'label': 'ROC-1',
             'value': 'ROC-1'},
            {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'},
            {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'},
            {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'},
            {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'},
            {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'},
            {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'},
            {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'},
            {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]},
          {'keep-dict-unrendered': True,
           'label': '图片-3',
           'value': '图片-3',
           'children': [{'keep-dict-unrendered': True,
             'label': 'ROC-1',
             'value': 'ROC-1'},
            {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'},
            {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'},
            {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'},
            {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'},
            {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'},
            {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'},
            {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'},
            {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]},
          {'keep-dict-unrendered': True,
           'label': '图片-4',
           'value': '图片-4',
           'children': [{'keep-dict-unrendered': True,
             'label': 'ROC-1',
             'value': 'ROC-1'},
            {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'},
            {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'},
            {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'},
            {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'},
            {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'},
            {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'},
            {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'},
            {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}]},
        {'component': 'fac.AntdText',
         'id': 'current-ax',
         'keyboard': True,
         'children': None,
         'style': {'font-size': 18}}],
       'style': {'display': 'flex',
        'justifyContent': 'center',
        'alignItems': 'center',
        'height': 200}}]},
    {'keep-dict-unrendered': True,
     'title': '步骤2',
     'subTitle': '上传数据',
     'description': [{'component': 'fac.AntdDivider', 'children': '上传数据'},
      {'component': 'fac.AntdDraggerUpload',
       'id': 'upload-raw-data',
       'apiUrl': '/upload/',
       'fileMaxSize': 10,
       'fileTypes': ['csv', 'xls', 'xlsx'],
       'text': '请上传csv, xls或xlsx文件',
       'hint': '选择Axes对象后,点击或拖拽文件至此处进行上传。',
       'showUploadList': False,
       'disabled': True},
      {'component': 'fac.AntdTable', 'id': 'upload-raw-data-table'}]},
    {'keep-dict-unrendered': True,
     'title': '步骤3',
     'subTitle': '计算统计量',
     'description': [{'component': 'fac.AntdDivider', 'children': '计算统计量'},
      {'component': 'fac.AntdSpace',
       'children': [{'component': 'html.Div',
         'children': [{'component': 'fac.AntdDivider',
           'children': '选择结局变量和自变量',
           'innerTextOrientation': 'left'}],
         'style': {'width': 1000}},
        {'component': 'fac.AntdSelect',
         'options': None,
         'placeholder': '选择结局变量(二分类因变量)',
         'id': 'outcome-variable',
         'style': {'width': 600}},
        {'component': 'fac.AntdTransfer',
         'titles': ['候选自变量', '选定自变量'],
         'dataSource': None,
         'targetKeys': None,
         'showSearch': True,
         'operations': ['放入', '移出'],
         'id': 'independent-variable',
         'height': 600,
         'style': {'width': 600}},
        {'component': 'fac.AntdSelect',
         'id': 'fit-model',
         'placeholder': '选择学习模型',
         'options': [{'keep-dict-unrendered': True,
           'label': '逻辑回归',
           'value': 'LogisticRegression'},
          {'keep-dict-unrendered': True,
           'label': '随机森林',
           'value': 'RandomForestClassifier'}],
         'style': {'width': 200}},
        {'component': 'fac.AntdButton',
         'children': '计算统计量',
         'id': 'calculate-statistics',
         'autoSpin': True,
         'type': 'primary',
         'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]},
        {'component': 'html.Div',
         'children': [{'component': 'fac.AntdDivider',
           'children': '计算结果',
           'innerTextOrientation': 'left'}],
         'style': {'width': 1000}},
        {'component': 'html.Div',
         'id': 'calculated-statistical-result',
         'children': []}],
       'direction': 'vertical',
       'style': {'display': 'flex',
        'justifyContent': 'center',
        'alignItems': 'center'}}]},
    {'keep-dict-unrendered': True,
     'title': '步骤4',
     'subTitle': '设定图层参数',
     'description': [{'component': 'fac.AntdDivider', 'children': '图层参数'},
      {'component': 'fac.AntdSpace',
       'children': [{'component': 'fac.AntdSpace',
         'children': [{'component': 'html.Div',
           'children': [{'component': 'fac.AntdDivider',
             'children': '图片格式',
             'innerTextOrientation': 'left'}],
           'style': {'width': 1000}},
          {'component': 'fac.AntdSelect',
           'id': {'type': 'update-plot-params-value', 'index': 'theme-style'},
           'options': "f(generate_attr_dict_from_str_list, str_list = plt.style.available, dict_keys = ['label', 'value'])",
           'placeholder': '选择主题',
           'style': {'width': 300}}],
         'direction': 'vertical'},
        {'component': 'fac.AntdSpace',
         'id': 'roc-ax-params',
         'style': {'display': 'none'},
         'children': [{'component': 'html.Div',
           'children': [{'component': 'fac.AntdDivider',
             'children': 'ROC图层参数',
             'innerTextOrientation': 'left'}],
           'style': {'width': 1000}},
          {'component': 'fac.AntdSpace',
           'children': [{'component': 'fac.AntdText',
             'children': '颜色',
             'keyboard': True,
             'style': {'font-size': 18}},
            {'component': 'fac.AntdButton',
             'id': {'type': 'open-color-palette', 'index': 'roc'},
             'children': '调色板',
             'type': 'primary',
             'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]},
            {'component': 'fac.AntdModal',
             'id': {'type': 'custom-color-picker', 'index': 'roc'},
             'children': [{'component': 'fac.AntdSpace',
               'children': [{'component': 'fuc.FefferyWheelColorPicker',
                 'id': {'type': 'color-wheel-selector', 'index': 'roc'}},
                {'component': 'html.Div',
                 'id': {'type': 'wheel-color-div', 'index': 'roc'},
                 'style': {'width': '200px',
                  'height': '200px',
                  'display': 'flex',
                  'alignItems': 'center',
                  'justifyContent': 'center',
                  "borderRadius'": '5px',
                  'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)',
                  'transition': '0.25s',
                  'backround': '#fffc51'}},
                {'component': 'fuc.FefferyTwitterColorPicker',
                 'id': {'type': 'color-twitter-selector', 'index': 'roc'},
                 'colors': ['#fff4ce',
                  '#797673',
                  '#fed9cc',
                  '#d83b01',
                  '#fde7e9',
                  '#a80000',
                  '#dff6dd',
                  '#107c10']}]}],
             'title': '选择自定义颜色',
             'renderFooter': True,
             'width': 800},
            {'component': 'fac.AntdSelect',
             'id': {'type': 'custom-color-selector', 'index': 'roc'},
             'defaultValue': '#1864ab',
             'options': [{'keep-dict-unrendered': True,
               'label': '自定义色',
               'value': '#1864ab',
               'colors': ['#1864ab']}],
             'colorsMode': 'diverging',
             'disabled': False,
             'style': {'width': 200}},
            {'component': 'fac.AntdSelect',
             'defaultValue': '配色1',
             'options': [{'keep-dict-unrendered': True,
               'label': '配色1',
               'value': '配色1',
               'colors': ['#fff5f5', '#ff8787', '#c92a2a']},
              {'keep-dict-unrendered': True,
               'label': '配色2',
               'value': '配色2',
               'colors': ['#f8f0fc', '#da77f2', '#862e9c']},
              {'keep-dict-unrendered': True,
               'label': '配色3',
               'value': '配色3',
               'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}],
             'colorsMode': 'diverging',
             'style': {'width': 200}},
            {'component': 'fac.AntdSelect',
             'defaultValue': 'RGB1',
             'options': [{'keep-dict-unrendered': True,
               'group': 'RGB',
               'options': [{'keep-dict-unrendered': True,
                 'label': '颜色1',
                 'value': 'RGB1',
                 'colors': ['#fff5f5']},
                {'keep-dict-unrendered': True,
                 'label': '颜色2',
                 'value': 'RGB2',
                 'colors': ['#ff8787']},
                {'keep-dict-unrendered': True,
                 'label': '颜色3',
                 'value': 'RGB3',
                 'colors': ['#c92a2a']}]},
              {'keep-dict-unrendered': True,
               'group': 'HEX',
               'options': [{'keep-dict-unrendered': True,
                 'label': '颜色1',
                 'value': 'HEX1',
                 'colors': ['#f8f0fc']},
                {'keep-dict-unrendered': True,
                 'label': '颜色2',
                 'value': 'HEX2',
                 'colors': ['#da77f2']},
                {'keep-dict-unrendered': True,
                 'label': '颜色3',
                 'value': 'HEX3',
                 'colors': ['#862e9c']}]}],
             'colorsMode': 'diverging',
             'style': {'width': 200}}]},
          {'component': 'fac.AntdSpace',
           'children': [{'component': 'fac.AntdText',
             'children': '曲线平滑度',
             'keyboard': True,
             'style': {'font-size': 18, 'marginTop': '10px'}},
            {'component': 'fac.AntdCheckbox',
             'id': {'type': 'update-plot-params-check',
              'index': 'smooth-line'},
             'label': '平滑',
             'style': {'marginTop': '10px'}}]},
          {'component': 'fac.AntdSpace',
           'children': [{'component': 'fac.AntdText',
             'children': '线条样式',
             'keyboard': True,
             'style': {'font-size': 18}},
            {'component': 'fac.AntdInputNumber',
             'min': 0.5,
             'step': 0.1,
             'max': 5,
             'defaultValue': 1,
             'id': {'type': 'update-plot-params-value',
              'index': 'line-width-roc'},
             'addonBefore': '线条粗细',
             'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}],
             'style': {'marginTop': '10px'}}]}],
         'direction': 'vertical'},
        {'component': 'fac.AntdSpace',
         'id': 'diagonal-ax-params',
         'style': {'display': 'none'},
         'children': [{'component': 'html.Div',
           'children': [{'component': 'fac.AntdDivider',
             'children': '对角线图层参数',
             'innerTextOrientation': 'left'}],
           'style': {'width': 1000}},
          {'component': 'fac.AntdSpace',
           'children': [{'component': 'fac.AntdText',
             'children': '颜色',
             'keyboard': True,
             'style': {'font-size': 18}},
            {'component': 'fac.AntdButton',
             'id': {'type': 'open-color-palette', 'index': 'diagonal'},
             'children': '调色板',
             'type': 'primary',
             'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]},
            {'component': 'fac.AntdModal',
             'id': {'type': 'custom-color-picker', 'index': 'diagonal'},
             'children': [{'component': 'fac.AntdSpace',
               'children': [{'component': 'fuc.FefferyWheelColorPicker',
                 'id': {'type': 'color-wheel-selector', 'index': 'diagonal'}},
                {'component': 'html.Div',
                 'id': {'type': 'wheel-color-div', 'index': 'diagonal'},
                 'style': {'width': '200px',
                  'height': '200px',
                  'display': 'flex',
                  'alignItems': 'center',
                  'justifyContent': 'center',
                  "borderRadius'": '5px',
                  'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)',
                  'transition': '0.25s',
                  'backround': '#fffc51'}},
                {'component': 'fuc.FefferyTwitterColorPicker',
                 'id': {'type': 'color-twitter-selector', 'index': 'diagonal'},
                 'colors': ['#fff4ce',
                  '#797673',
                  '#fed9cc',
                  '#d83b01',
                  '#fde7e9',
                  '#a80000',
                  '#dff6dd',
                  '#107c10']}]}],
             'title': '选择自定义颜色',
             'renderFooter': True,
             'width': 800},
            {'component': 'fac.AntdSelect',
             'id': {'type': 'custom-color-selector', 'index': 'diagonal'},
             'defaultValue': '#1864ab',
             'options': [{'keep-dict-unrendered': True,
               'label': '自定义色',
               'value': '#1864ab',
               'colors': ['#1864ab']}],
             'colorsMode': 'diverging',
             'disabled': False,
             'style': {'width': 200}},
            {'component': 'fac.AntdSelect',
             'defaultValue': '配色1',
             'options': [{'keep-dict-unrendered': True,
               'label': '配色1',
               'value': '配色1',
               'colors': ['#fff5f5', '#ff8787', '#c92a2a']},
              {'keep-dict-unrendered': True,
               'label': '配色2',
               'value': '配色2',
               'colors': ['#f8f0fc', '#da77f2', '#862e9c']},
              {'keep-dict-unrendered': True,
               'label': '配色3',
               'value': '配色3',
               'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}],
             'colorsMode': 'diverging',
             'style': {'width': 200}},
            {'component': 'fac.AntdSelect',
             'defaultValue': 'RGB1',
             'options': [{'keep-dict-unrendered': True,
               'group': 'RGB',
               'options': [{'keep-dict-unrendered': True,
                 'label': '颜色1',
                 'value': 'RGB1',
                 'colors': ['#fff5f5']},
                {'keep-dict-unrendered': True,
                 'label': '颜色2',
                 'value': 'RGB2',
                 'colors': ['#ff8787']},
                {'keep-dict-unrendered': True,
                 'label': '颜色3',
                 'value': 'RGB3',
                 'colors': ['#c92a2a']}]},
              {'keep-dict-unrendered': True,
               'group': 'HEX',
               'options': [{'keep-dict-unrendered': True,
                 'label': '颜色1',
                 'value': 'HEX1',
                 'colors': ['#f8f0fc']},
                {'keep-dict-unrendered': True,
                 'label': '颜色2',
                 'value': 'HEX2',
                 'colors': ['#da77f2']},
                {'keep-dict-unrendered': True,
                 'label': '颜色3',
                 'value': 'HEX3',
                 'colors': ['#862e9c']}]}],
             'colorsMode': 'diverging',
             'style': {'width': 200}}]},
          {'component': 'fac.AntdSpace',
           'children': [{'component': 'fac.AntdText',
             'children': '线条样式',
             'keyboard': True,
             'style': {'font-size': 18}},
            {'component': 'fac.AntdInputNumber',
             'id': {'type': 'update-plot-params-value',
              'index': 'line-width-diagonal'},
             'addonBefore': '线条粗细',
             'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}],
             'min': 0.5,
             'step': 0.1,
             'max': 5,
             'defaultValue': 1,
             'style': {'marginTop': '10px'}}]}],
         'direction': 'vertical'}],
       'direction': 'vertical',
       'style': {'display': 'flex',
        'justifyContent': 'left',
        'alignItems': 'center'}}]},
    {'keep-dict-unrendered': True,
     'title': '步骤5',
     'subTitle': '作图',
     'description': [{'component': 'fac.AntdDivider', 'children': '作图'},
      {'component': 'fac.AntdSpace',
       'children': [{'component': 'html.Div',
         'children': [{'component': 'fac.AntdDivider',
           'children': '选择图片布局',
           'innerTextOrientation': 'left'}],
         'style': {'width': 1000}},
        {'component': 'fac.AntdCheckCardGroup',
         'children': [{'component': 'fac.AntdCheckCard',
           'children': '1行1列',
           'value': '1r1c',
           'size': 'small'},
          {'component': 'fac.AntdCheckCard',
           'children': '1行2列',
           'value': '1r2c',
           'size': 'small'},
          {'component': 'fac.AntdCheckCard',
           'children': '2行1列',
           'value': '2r1c',
           'size': 'small'},
          {'component': 'fac.AntdCheckCard',
           'children': '2行2列',
           'value': '2r2c',
           'size': 'small'}],
         'defaultValue': '1r1c'},
        {'component': 'html.Div',
         'children': [{'component': 'fac.AntdDivider',
           'children': '选择图层',
           'innerTextOrientation': 'left'}],
         'style': {'width': 1000}},
        {'component': 'fac.AntdCascader',
         'id': 'plot-axes-cascader',
         'placeholder': '选择图层对象',
         'options': [{'keep-dict-unrendered': True,
           'label': '图片-1',
           'value': '图片-1',
           'children': [{'keep-dict-unrendered': True,
             'label': 'ROC-1',
             'value': 'ROC-1'},
            {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'},
            {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'},
            {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'},
            {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'},
            {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'},
            {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'},
            {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'},
            {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]},
          {'keep-dict-unrendered': True,
           'label': '图片-2',
           'value': '图片-2',
           'children': [{'keep-dict-unrendered': True,
             'label': 'ROC-1',
             'value': 'ROC-1'},
            {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'},
            {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'},
            {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'},
            {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'},
            {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'},
            {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'},
            {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'},
            {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]},
          {'keep-dict-unrendered': True,
           'label': '图片-3',
           'value': '图片-3',
           'children': [{'keep-dict-unrendered': True,
             'label': 'ROC-1',
             'value': 'ROC-1'},
            {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'},
            {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'},
            {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'},
            {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'},
            {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'},
            {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'},
            {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'},
            {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]},
          {'keep-dict-unrendered': True,
           'label': '图片-4',
           'value': '图片-4',
           'children': [{'keep-dict-unrendered': True,
             'label': 'ROC-1',
             'value': 'ROC-1'},
            {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'},
            {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'},
            {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'},
            {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'},
            {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'},
            {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'},
            {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'},
            {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}],
         'multiple': True},
        {'component': 'fac.AntdButton',
         'id': 'generate-plot',
         'children': '生成图片',
         'type': 'primary',
         'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}],
         'style': {'marginTop': '100px'}}],
       'direction': 'vertical',
       'style': {'display': 'flex',
        'justifyContent': 'left',
        'alignItems': 'center',
        'height': 400}}]},
    {'keep-dict-unrendered': True,
     'title': '步骤6',
     'subTitle': '图片展示',
     'description': [{'component': 'fac.AntdDivider', 'children': '画廊'},
      {'component': 'fac.AntdSpace',
       'children': [{'component': 'html.Div',
         'children': [{'component': 'fac.AntdDivider',
           'children': '当前图片',
           'innerTextOrientation': 'left'}],
         'style': {'width': 1000}},
        {'component': 'html.Div',
         'children': [{'component': 'fac.AntdImage',
           'id': 'statical-single-plot',
           'src': None,
           'height': 600}]},
        {'component': 'html.Div',
         'children': [{'component': 'fac.AntdDivider',
           'children': '历史图片',
           'innerTextOrientation': 'left'}],
         'style': {'width': 1000}},
        {'component': 'html.Div',
         'children': [{'component': 'fac.AntdImage',
           'id': {'type': 'image', 'index': 'display-multiple-plots'},
           'src': [],
           'multiImageMode': 'unfold',
           'height': 160}]}],
       'direction': 'vertical',
       'style': {'display': 'flex',
        'justifyContent': 'left',
        'alignItems': 'center'}}]}],
   'direction': 'vertical',
   'allowClick': True}],
 'style': {'margin': '50px 50px 50px 50px'}}

10.8.3.5 将json渲染成layout的函数

复杂流程的调试心得:每个if环节均将符合if的条件以及if代码块做的事情print出来

def render_json_as_component(json_data):
    rendered_components_layout = []
    if isinstance(json_data, dict):  # 继续剥洋葱的条件,即遍历到的对象为字典
        print(f"\n\njson_data是字典,符合渲染条件:{json_data=},\n开始逐个元素渲染....")

        # 判断是否有keep-dict-unrendered键,如果有则用:连接attr_name和attr_value,否则用=连接
        
        if json_data.get('keep-dict-unrendered'):
            
            print(f"捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{{}}`,并且删除keep-dict-unrendered键")
            link_mark = ' : '
            bracket = '{}'
            json_data.pop('keep-dict-unrendered')
        else:
            print(f"未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`")
            link_mark = ' = '
            bracket = '()'
            
        for attr_name, attr_value in json_data.items():  # 对json_data的元素逐一进行渲染和添加
            
            # 如果link_mark为冒号(:),则attr_name要加上引号
            if link_mark == ' : ':

                print(f"连接符为冒号(:),attr_name加上引号")
                attr_name = repr(attr_name)
                
            if isinstance(attr_value, dict):  # 字典不渲染
                print(f"\n字典.{attr_name=}, {attr_value=},不渲染attr_value,以`attr_name{link_mark}attr_value`形式添加至组件列表")
                rendered_components_layout.append(f"{attr_name}{link_mark}{attr_value}")

            elif isinstance(attr_value, list): # 列表,*****这个是继续遍历的原因*****
               
                if attr_value: # 不为空
                    if isinstance(attr_value[0], dict):  # 如果还是字典,循环应用该函数,以列表的第1个元素判断
                        print(f"\n列表.{attr_name=}, {attr_value=},attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素")
                        
                        items = ', '.join([render_json_as_component(item) for item in attr_value])
                        
                        print(f"\n列表渲染前:{attr_value=}\n渲染后:{items=},以`attr_name{link_mark}attr_value`形式添加至组件列表")
                        
                        rendered_components_layout.append(f"{attr_name}{link_mark}[{items}]")
                        
                    else: # 不是字典,则正常处理
                        print(f"\n列表.{attr_name=}, {attr_value=},attr_value的元素不是字典(以第1个元素判断),以`attr_name=attr_value`形式添加至组件列表")
                        rendered_components_layout.append(f"{attr_name}{link_mark}{attr_value}")
                else:  # 空值直接添加,这时attr_value = None
                    print(f"\n列表.{attr_name=}, {attr_value=},attr_value是空值,以`attr_name{link_mark}attr_value`形式添加至组件列表")
                    rendered_components_layout.append(f"{attr_name}{link_mark}{attr_value}")

            elif isinstance(attr_value, str):
                if attr_value.startswith('f('):
                    print(f"\n字符.{attr_name=}, {attr_value=},attr_value是函数,attr_value渲染成函数")
                    function_name, args = attr_value.strip('f()').split(',', 1)
                    attr_value =  f'{function_name}({args})'
                else:
                    print(f"\n字符.{attr_name=}, {attr_value=},attr_value不是函数,attr_value加上引号")
                    attr_value = repr(attr_value)
                    
                if attr_name not in ['component'] :  # 不需要渲染的key
                    print(f"\n字符.{attr_name=}, {attr_value=},attr_name不属于排除对象,以`attr_name{link_mark}attr_value`形式添加至组件列表")
                    rendered_components_layout.append(f"{attr_name}{link_mark}{attr_value}")
                else:
                    print(f"\n字符.{attr_name=}, {attr_value=},attr_name属于排除对象,不添加至组件列表")
                    pass

            elif isinstance(attr_value, int): # 整数,经过测试True也被看作整数
                if attr_name not in ['component']:
                    print(f"\n整数.{attr_name=}, {attr_value=},attr_name不属于排除对象,以`attr_name{link_mark}attr_value`形式添加至组件列表添加至组件列表")
                    rendered_components_layout.append(f"{attr_name}{link_mark}{attr_value}")
                else:
                    print(f"\n整数.{attr_name=}, {attr_value=},attr_name属于排除对象,不添加至组件列表")
                    pass

            elif attr_value is None: # 空对象
                print(f"\nNone.{attr_name=}, {attr_value=}, attr_value是空对象,不渲染,不添加")
                pass # 不添加,让其保持默认值,防止前端渲染时react报错
                
            else:
                print(f"\n其他.{attr_name=}, {attr_value=}, attr_value是其他类型,不渲染,不添加")
                pass

    
    if "component" in json_data:
        return f"{json_data['component']}({', '.join(rendered_components_layout)})"
    else:
        left_bracket, right_bracket = bracket
        return f"{left_bracket}{', '.join(rendered_components_layout)}{right_bracket}"

rendered_statement_layout = f"app.layout = {render_json_as_component(layout_statements)}"

print(f"\n{rendered_statement_layout}")


json_data是字典,符合渲染条件:json_data={'component': 'html.Div', 'id': {'type': 'main-container-div', 'index': 'heihei'}, 'children': [{'component': 'html.Div', 'children': None, 'id': 'message-container'}, {'component': 'fac.AntdSteps', 'steps': [{'keep-dict-unrendered': True, 'title': '步骤1', 'subTitle': '选择图层', 'description': [{'component': 'fac.AntdDivider', 'children': '图层'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdCascader', 'id': 'fig-axes-cascader', 'placeholder': '选择图层对象', 'expandTrigger': 'hover', 'options': [{'keep-dict-unrendered': True, 'label': '图片-1', 'value': '图片-1', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-2', 'value': '图片-2', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-3', 'value': '图片-3', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-4', 'value': '图片-4', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}]}, {'component': 'fac.AntdText', 'id': 'current-ax', 'keyboard': True, 'children': None, 'style': {'font-size': 18}}], 'style': {'display': 'flex', 'justifyContent': 'center', 'alignItems': 'center', 'height': 200}}]}, {'keep-dict-unrendered': True, 'title': '步骤2', 'subTitle': '上传数据', 'description': [{'component': 'fac.AntdDivider', 'children': '上传数据'}, {'component': 'fac.AntdDraggerUpload', 'id': 'upload-raw-data', 'apiUrl': '/upload/', 'fileMaxSize': 10, 'fileTypes': ['csv', 'xls', 'xlsx'], 'text': '请上传csv, xls或xlsx文件', 'hint': '选择Axes对象后,点击或拖拽文件至此处进行上传。', 'showUploadList': False, 'disabled': True}, {'component': 'fac.AntdTable', 'id': 'upload-raw-data-table'}]}, {'keep-dict-unrendered': True, 'title': '步骤3', 'subTitle': '计算统计量', 'description': [{'component': 'fac.AntdDivider', 'children': '计算统计量'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择结局变量和自变量', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'options': None, 'placeholder': '选择结局变量(二分类因变量)', 'id': 'outcome-variable', 'style': {'width': 600}}, {'component': 'fac.AntdTransfer', 'titles': ['候选自变量', '选定自变量'], 'dataSource': None, 'targetKeys': None, 'showSearch': True, 'operations': ['放入', '移出'], 'id': 'independent-variable', 'height': 600, 'style': {'width': 600}}, {'component': 'fac.AntdSelect', 'id': 'fit-model', 'placeholder': '选择学习模型', 'options': [{'keep-dict-unrendered': True, 'label': '逻辑回归', 'value': 'LogisticRegression'}, {'keep-dict-unrendered': True, 'label': '随机森林', 'value': 'RandomForestClassifier'}], 'style': {'width': 200}}, {'component': 'fac.AntdButton', 'children': '计算统计量', 'id': 'calculate-statistics', 'autoSpin': True, 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '计算结果', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'id': 'calculated-statistical-result', 'children': []}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'center', 'alignItems': 'center'}}]}, {'keep-dict-unrendered': True, 'title': '步骤4', 'subTitle': '设定图层参数', 'description': [{'component': 'fac.AntdDivider', 'children': '图层参数'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '图片格式', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'id': {'type': 'update-plot-params-value', 'index': 'theme-style'}, 'options': "f(generate_attr_dict_from_str_list, str_list = plt.style.available, dict_keys = ['label', 'value'])", 'placeholder': '选择主题', 'style': {'width': 300}}], 'direction': 'vertical'}, {'component': 'fac.AntdSpace', 'id': 'roc-ax-params', 'style': {'display': 'none'}, 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': 'ROC图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'roc'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'roc'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'roc'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'roc'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'roc'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'roc'}, 'defaultValue': '#1864ab', 'options': [{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '曲线平滑度', 'keyboard': True, 'style': {'font-size': 18, 'marginTop': '10px'}}, {'component': 'fac.AntdCheckbox', 'id': {'type': 'update-plot-params-check', 'index': 'smooth-line'}, 'label': '平滑', 'style': {'marginTop': '10px'}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'id': {'type': 'update-plot-params-value', 'index': 'line-width-roc'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'style': {'marginTop': '10px'}}]}], 'direction': 'vertical'}, {'component': 'fac.AntdSpace', 'id': 'diagonal-ax-params', 'style': {'display': 'none'}, 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '对角线图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'diagonal'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'diagonal'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'diagonal'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'diagonal'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'diagonal'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'diagonal'}, 'defaultValue': '#1864ab', 'options': [{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'id': {'type': 'update-plot-params-value', 'index': 'line-width-diagonal'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'style': {'marginTop': '10px'}}]}], 'direction': 'vertical'}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center'}}]}, {'keep-dict-unrendered': True, 'title': '步骤5', 'subTitle': '作图', 'description': [{'component': 'fac.AntdDivider', 'children': '作图'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择图片布局', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdCheckCardGroup', 'children': [{'component': 'fac.AntdCheckCard', 'children': '1行1列', 'value': '1r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '1行2列', 'value': '1r2c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行1列', 'value': '2r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行2列', 'value': '2r2c', 'size': 'small'}], 'defaultValue': '1r1c'}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择图层', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdCascader', 'id': 'plot-axes-cascader', 'placeholder': '选择图层对象', 'options': [{'keep-dict-unrendered': True, 'label': '图片-1', 'value': '图片-1', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-2', 'value': '图片-2', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-3', 'value': '图片-3', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-4', 'value': '图片-4', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}], 'multiple': True}, {'component': 'fac.AntdButton', 'id': 'generate-plot', 'children': '生成图片', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}], 'style': {'marginTop': '100px'}}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center', 'height': 400}}]}, {'keep-dict-unrendered': True, 'title': '步骤6', 'subTitle': '图片展示', 'description': [{'component': 'fac.AntdDivider', 'children': '画廊'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '当前图片', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdImage', 'id': 'statical-single-plot', 'src': None, 'height': 600}]}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '历史图片', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdImage', 'id': {'type': 'image', 'index': 'display-multiple-plots'}, 'src': [], 'multiImageMode': 'unfold', 'height': 160}]}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center'}}]}], 'direction': 'vertical', 'allowClick': True}], 'style': {'margin': '50px 50px 50px 50px'}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='html.Div',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'html.Div'",attr_name属于排除对象,不添加至组件列表

字典.attr_name='id', attr_value={'type': 'main-container-div', 'index': 'heihei'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'html.Div', 'children': None, 'id': 'message-container'}, {'component': 'fac.AntdSteps', 'steps': [{'keep-dict-unrendered': True, 'title': '步骤1', 'subTitle': '选择图层', 'description': [{'component': 'fac.AntdDivider', 'children': '图层'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdCascader', 'id': 'fig-axes-cascader', 'placeholder': '选择图层对象', 'expandTrigger': 'hover', 'options': [{'keep-dict-unrendered': True, 'label': '图片-1', 'value': '图片-1', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-2', 'value': '图片-2', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-3', 'value': '图片-3', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-4', 'value': '图片-4', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}]}, {'component': 'fac.AntdText', 'id': 'current-ax', 'keyboard': True, 'children': None, 'style': {'font-size': 18}}], 'style': {'display': 'flex', 'justifyContent': 'center', 'alignItems': 'center', 'height': 200}}]}, {'keep-dict-unrendered': True, 'title': '步骤2', 'subTitle': '上传数据', 'description': [{'component': 'fac.AntdDivider', 'children': '上传数据'}, {'component': 'fac.AntdDraggerUpload', 'id': 'upload-raw-data', 'apiUrl': '/upload/', 'fileMaxSize': 10, 'fileTypes': ['csv', 'xls', 'xlsx'], 'text': '请上传csv, xls或xlsx文件', 'hint': '选择Axes对象后,点击或拖拽文件至此处进行上传。', 'showUploadList': False, 'disabled': True}, {'component': 'fac.AntdTable', 'id': 'upload-raw-data-table'}]}, {'keep-dict-unrendered': True, 'title': '步骤3', 'subTitle': '计算统计量', 'description': [{'component': 'fac.AntdDivider', 'children': '计算统计量'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择结局变量和自变量', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'options': None, 'placeholder': '选择结局变量(二分类因变量)', 'id': 'outcome-variable', 'style': {'width': 600}}, {'component': 'fac.AntdTransfer', 'titles': ['候选自变量', '选定自变量'], 'dataSource': None, 'targetKeys': None, 'showSearch': True, 'operations': ['放入', '移出'], 'id': 'independent-variable', 'height': 600, 'style': {'width': 600}}, {'component': 'fac.AntdSelect', 'id': 'fit-model', 'placeholder': '选择学习模型', 'options': [{'keep-dict-unrendered': True, 'label': '逻辑回归', 'value': 'LogisticRegression'}, {'keep-dict-unrendered': True, 'label': '随机森林', 'value': 'RandomForestClassifier'}], 'style': {'width': 200}}, {'component': 'fac.AntdButton', 'children': '计算统计量', 'id': 'calculate-statistics', 'autoSpin': True, 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '计算结果', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'id': 'calculated-statistical-result', 'children': []}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'center', 'alignItems': 'center'}}]}, {'keep-dict-unrendered': True, 'title': '步骤4', 'subTitle': '设定图层参数', 'description': [{'component': 'fac.AntdDivider', 'children': '图层参数'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '图片格式', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'id': {'type': 'update-plot-params-value', 'index': 'theme-style'}, 'options': "f(generate_attr_dict_from_str_list, str_list = plt.style.available, dict_keys = ['label', 'value'])", 'placeholder': '选择主题', 'style': {'width': 300}}], 'direction': 'vertical'}, {'component': 'fac.AntdSpace', 'id': 'roc-ax-params', 'style': {'display': 'none'}, 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': 'ROC图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'roc'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'roc'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'roc'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'roc'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'roc'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'roc'}, 'defaultValue': '#1864ab', 'options': [{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '曲线平滑度', 'keyboard': True, 'style': {'font-size': 18, 'marginTop': '10px'}}, {'component': 'fac.AntdCheckbox', 'id': {'type': 'update-plot-params-check', 'index': 'smooth-line'}, 'label': '平滑', 'style': {'marginTop': '10px'}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'id': {'type': 'update-plot-params-value', 'index': 'line-width-roc'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'style': {'marginTop': '10px'}}]}], 'direction': 'vertical'}, {'component': 'fac.AntdSpace', 'id': 'diagonal-ax-params', 'style': {'display': 'none'}, 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '对角线图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'diagonal'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'diagonal'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'diagonal'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'diagonal'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'diagonal'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'diagonal'}, 'defaultValue': '#1864ab', 'options': [{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'id': {'type': 'update-plot-params-value', 'index': 'line-width-diagonal'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'style': {'marginTop': '10px'}}]}], 'direction': 'vertical'}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center'}}]}, {'keep-dict-unrendered': True, 'title': '步骤5', 'subTitle': '作图', 'description': [{'component': 'fac.AntdDivider', 'children': '作图'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择图片布局', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdCheckCardGroup', 'children': [{'component': 'fac.AntdCheckCard', 'children': '1行1列', 'value': '1r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '1行2列', 'value': '1r2c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行1列', 'value': '2r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行2列', 'value': '2r2c', 'size': 'small'}], 'defaultValue': '1r1c'}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择图层', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdCascader', 'id': 'plot-axes-cascader', 'placeholder': '选择图层对象', 'options': [{'keep-dict-unrendered': True, 'label': '图片-1', 'value': '图片-1', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-2', 'value': '图片-2', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-3', 'value': '图片-3', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-4', 'value': '图片-4', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}], 'multiple': True}, {'component': 'fac.AntdButton', 'id': 'generate-plot', 'children': '生成图片', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}], 'style': {'marginTop': '100px'}}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center', 'height': 400}}]}, {'keep-dict-unrendered': True, 'title': '步骤6', 'subTitle': '图片展示', 'description': [{'component': 'fac.AntdDivider', 'children': '画廊'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '当前图片', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdImage', 'id': 'statical-single-plot', 'src': None, 'height': 600}]}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '历史图片', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdImage', 'id': {'type': 'image', 'index': 'display-multiple-plots'}, 'src': [], 'multiImageMode': 'unfold', 'height': 160}]}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center'}}]}], 'direction': 'vertical', 'allowClick': True}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'html.Div', 'children': None, 'id': 'message-container'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='html.Div',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'html.Div'",attr_name属于排除对象,不添加至组件列表

None.attr_name='children', attr_value=None, attr_value是空对象,不渲染,不添加

字符.attr_name='id', attr_value='message-container',attr_value不是函数,attr_value加上引号

字符.attr_name='id', attr_value="'message-container'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdSteps', 'steps': [{'keep-dict-unrendered': True, 'title': '步骤1', 'subTitle': '选择图层', 'description': [{'component': 'fac.AntdDivider', 'children': '图层'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdCascader', 'id': 'fig-axes-cascader', 'placeholder': '选择图层对象', 'expandTrigger': 'hover', 'options': [{'keep-dict-unrendered': True, 'label': '图片-1', 'value': '图片-1', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-2', 'value': '图片-2', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-3', 'value': '图片-3', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-4', 'value': '图片-4', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}]}, {'component': 'fac.AntdText', 'id': 'current-ax', 'keyboard': True, 'children': None, 'style': {'font-size': 18}}], 'style': {'display': 'flex', 'justifyContent': 'center', 'alignItems': 'center', 'height': 200}}]}, {'keep-dict-unrendered': True, 'title': '步骤2', 'subTitle': '上传数据', 'description': [{'component': 'fac.AntdDivider', 'children': '上传数据'}, {'component': 'fac.AntdDraggerUpload', 'id': 'upload-raw-data', 'apiUrl': '/upload/', 'fileMaxSize': 10, 'fileTypes': ['csv', 'xls', 'xlsx'], 'text': '请上传csv, xls或xlsx文件', 'hint': '选择Axes对象后,点击或拖拽文件至此处进行上传。', 'showUploadList': False, 'disabled': True}, {'component': 'fac.AntdTable', 'id': 'upload-raw-data-table'}]}, {'keep-dict-unrendered': True, 'title': '步骤3', 'subTitle': '计算统计量', 'description': [{'component': 'fac.AntdDivider', 'children': '计算统计量'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择结局变量和自变量', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'options': None, 'placeholder': '选择结局变量(二分类因变量)', 'id': 'outcome-variable', 'style': {'width': 600}}, {'component': 'fac.AntdTransfer', 'titles': ['候选自变量', '选定自变量'], 'dataSource': None, 'targetKeys': None, 'showSearch': True, 'operations': ['放入', '移出'], 'id': 'independent-variable', 'height': 600, 'style': {'width': 600}}, {'component': 'fac.AntdSelect', 'id': 'fit-model', 'placeholder': '选择学习模型', 'options': [{'keep-dict-unrendered': True, 'label': '逻辑回归', 'value': 'LogisticRegression'}, {'keep-dict-unrendered': True, 'label': '随机森林', 'value': 'RandomForestClassifier'}], 'style': {'width': 200}}, {'component': 'fac.AntdButton', 'children': '计算统计量', 'id': 'calculate-statistics', 'autoSpin': True, 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '计算结果', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'id': 'calculated-statistical-result', 'children': []}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'center', 'alignItems': 'center'}}]}, {'keep-dict-unrendered': True, 'title': '步骤4', 'subTitle': '设定图层参数', 'description': [{'component': 'fac.AntdDivider', 'children': '图层参数'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '图片格式', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'id': {'type': 'update-plot-params-value', 'index': 'theme-style'}, 'options': "f(generate_attr_dict_from_str_list, str_list = plt.style.available, dict_keys = ['label', 'value'])", 'placeholder': '选择主题', 'style': {'width': 300}}], 'direction': 'vertical'}, {'component': 'fac.AntdSpace', 'id': 'roc-ax-params', 'style': {'display': 'none'}, 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': 'ROC图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'roc'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'roc'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'roc'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'roc'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'roc'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'roc'}, 'defaultValue': '#1864ab', 'options': [{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '曲线平滑度', 'keyboard': True, 'style': {'font-size': 18, 'marginTop': '10px'}}, {'component': 'fac.AntdCheckbox', 'id': {'type': 'update-plot-params-check', 'index': 'smooth-line'}, 'label': '平滑', 'style': {'marginTop': '10px'}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'id': {'type': 'update-plot-params-value', 'index': 'line-width-roc'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'style': {'marginTop': '10px'}}]}], 'direction': 'vertical'}, {'component': 'fac.AntdSpace', 'id': 'diagonal-ax-params', 'style': {'display': 'none'}, 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '对角线图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'diagonal'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'diagonal'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'diagonal'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'diagonal'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'diagonal'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'diagonal'}, 'defaultValue': '#1864ab', 'options': [{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'id': {'type': 'update-plot-params-value', 'index': 'line-width-diagonal'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'style': {'marginTop': '10px'}}]}], 'direction': 'vertical'}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center'}}]}, {'keep-dict-unrendered': True, 'title': '步骤5', 'subTitle': '作图', 'description': [{'component': 'fac.AntdDivider', 'children': '作图'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择图片布局', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdCheckCardGroup', 'children': [{'component': 'fac.AntdCheckCard', 'children': '1行1列', 'value': '1r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '1行2列', 'value': '1r2c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行1列', 'value': '2r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行2列', 'value': '2r2c', 'size': 'small'}], 'defaultValue': '1r1c'}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择图层', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdCascader', 'id': 'plot-axes-cascader', 'placeholder': '选择图层对象', 'options': [{'keep-dict-unrendered': True, 'label': '图片-1', 'value': '图片-1', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-2', 'value': '图片-2', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-3', 'value': '图片-3', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-4', 'value': '图片-4', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}], 'multiple': True}, {'component': 'fac.AntdButton', 'id': 'generate-plot', 'children': '生成图片', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}], 'style': {'marginTop': '100px'}}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center', 'height': 400}}]}, {'keep-dict-unrendered': True, 'title': '步骤6', 'subTitle': '图片展示', 'description': [{'component': 'fac.AntdDivider', 'children': '画廊'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '当前图片', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdImage', 'id': 'statical-single-plot', 'src': None, 'height': 600}]}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '历史图片', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdImage', 'id': {'type': 'image', 'index': 'display-multiple-plots'}, 'src': [], 'multiImageMode': 'unfold', 'height': 160}]}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center'}}]}], 'direction': 'vertical', 'allowClick': True},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdSteps',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdSteps'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='steps', attr_value=[{'keep-dict-unrendered': True, 'title': '步骤1', 'subTitle': '选择图层', 'description': [{'component': 'fac.AntdDivider', 'children': '图层'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdCascader', 'id': 'fig-axes-cascader', 'placeholder': '选择图层对象', 'expandTrigger': 'hover', 'options': [{'keep-dict-unrendered': True, 'label': '图片-1', 'value': '图片-1', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-2', 'value': '图片-2', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-3', 'value': '图片-3', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-4', 'value': '图片-4', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}]}, {'component': 'fac.AntdText', 'id': 'current-ax', 'keyboard': True, 'children': None, 'style': {'font-size': 18}}], 'style': {'display': 'flex', 'justifyContent': 'center', 'alignItems': 'center', 'height': 200}}]}, {'keep-dict-unrendered': True, 'title': '步骤2', 'subTitle': '上传数据', 'description': [{'component': 'fac.AntdDivider', 'children': '上传数据'}, {'component': 'fac.AntdDraggerUpload', 'id': 'upload-raw-data', 'apiUrl': '/upload/', 'fileMaxSize': 10, 'fileTypes': ['csv', 'xls', 'xlsx'], 'text': '请上传csv, xls或xlsx文件', 'hint': '选择Axes对象后,点击或拖拽文件至此处进行上传。', 'showUploadList': False, 'disabled': True}, {'component': 'fac.AntdTable', 'id': 'upload-raw-data-table'}]}, {'keep-dict-unrendered': True, 'title': '步骤3', 'subTitle': '计算统计量', 'description': [{'component': 'fac.AntdDivider', 'children': '计算统计量'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择结局变量和自变量', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'options': None, 'placeholder': '选择结局变量(二分类因变量)', 'id': 'outcome-variable', 'style': {'width': 600}}, {'component': 'fac.AntdTransfer', 'titles': ['候选自变量', '选定自变量'], 'dataSource': None, 'targetKeys': None, 'showSearch': True, 'operations': ['放入', '移出'], 'id': 'independent-variable', 'height': 600, 'style': {'width': 600}}, {'component': 'fac.AntdSelect', 'id': 'fit-model', 'placeholder': '选择学习模型', 'options': [{'keep-dict-unrendered': True, 'label': '逻辑回归', 'value': 'LogisticRegression'}, {'keep-dict-unrendered': True, 'label': '随机森林', 'value': 'RandomForestClassifier'}], 'style': {'width': 200}}, {'component': 'fac.AntdButton', 'children': '计算统计量', 'id': 'calculate-statistics', 'autoSpin': True, 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '计算结果', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'id': 'calculated-statistical-result', 'children': []}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'center', 'alignItems': 'center'}}]}, {'keep-dict-unrendered': True, 'title': '步骤4', 'subTitle': '设定图层参数', 'description': [{'component': 'fac.AntdDivider', 'children': '图层参数'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '图片格式', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'id': {'type': 'update-plot-params-value', 'index': 'theme-style'}, 'options': "f(generate_attr_dict_from_str_list, str_list = plt.style.available, dict_keys = ['label', 'value'])", 'placeholder': '选择主题', 'style': {'width': 300}}], 'direction': 'vertical'}, {'component': 'fac.AntdSpace', 'id': 'roc-ax-params', 'style': {'display': 'none'}, 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': 'ROC图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'roc'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'roc'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'roc'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'roc'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'roc'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'roc'}, 'defaultValue': '#1864ab', 'options': [{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '曲线平滑度', 'keyboard': True, 'style': {'font-size': 18, 'marginTop': '10px'}}, {'component': 'fac.AntdCheckbox', 'id': {'type': 'update-plot-params-check', 'index': 'smooth-line'}, 'label': '平滑', 'style': {'marginTop': '10px'}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'id': {'type': 'update-plot-params-value', 'index': 'line-width-roc'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'style': {'marginTop': '10px'}}]}], 'direction': 'vertical'}, {'component': 'fac.AntdSpace', 'id': 'diagonal-ax-params', 'style': {'display': 'none'}, 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '对角线图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'diagonal'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'diagonal'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'diagonal'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'diagonal'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'diagonal'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'diagonal'}, 'defaultValue': '#1864ab', 'options': [{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'id': {'type': 'update-plot-params-value', 'index': 'line-width-diagonal'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'style': {'marginTop': '10px'}}]}], 'direction': 'vertical'}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center'}}]}, {'keep-dict-unrendered': True, 'title': '步骤5', 'subTitle': '作图', 'description': [{'component': 'fac.AntdDivider', 'children': '作图'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择图片布局', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdCheckCardGroup', 'children': [{'component': 'fac.AntdCheckCard', 'children': '1行1列', 'value': '1r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '1行2列', 'value': '1r2c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行1列', 'value': '2r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行2列', 'value': '2r2c', 'size': 'small'}], 'defaultValue': '1r1c'}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择图层', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdCascader', 'id': 'plot-axes-cascader', 'placeholder': '选择图层对象', 'options': [{'keep-dict-unrendered': True, 'label': '图片-1', 'value': '图片-1', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-2', 'value': '图片-2', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-3', 'value': '图片-3', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-4', 'value': '图片-4', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}], 'multiple': True}, {'component': 'fac.AntdButton', 'id': 'generate-plot', 'children': '生成图片', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}], 'style': {'marginTop': '100px'}}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center', 'height': 400}}]}, {'keep-dict-unrendered': True, 'title': '步骤6', 'subTitle': '图片展示', 'description': [{'component': 'fac.AntdDivider', 'children': '画廊'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '当前图片', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdImage', 'id': 'statical-single-plot', 'src': None, 'height': 600}]}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '历史图片', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdImage', 'id': {'type': 'image', 'index': 'display-multiple-plots'}, 'src': [], 'multiImageMode': 'unfold', 'height': 160}]}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center'}}]}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'title': '步骤1', 'subTitle': '选择图层', 'description': [{'component': 'fac.AntdDivider', 'children': '图层'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdCascader', 'id': 'fig-axes-cascader', 'placeholder': '选择图层对象', 'expandTrigger': 'hover', 'options': [{'keep-dict-unrendered': True, 'label': '图片-1', 'value': '图片-1', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-2', 'value': '图片-2', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-3', 'value': '图片-3', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-4', 'value': '图片-4', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}]}, {'component': 'fac.AntdText', 'id': 'current-ax', 'keyboard': True, 'children': None, 'style': {'font-size': 18}}], 'style': {'display': 'flex', 'justifyContent': 'center', 'alignItems': 'center', 'height': 200}}]},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'title'", attr_value='步骤1',attr_value不是函数,attr_value加上引号

字符.attr_name="'title'", attr_value="'步骤1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'subTitle'", attr_value='选择图层',attr_value不是函数,attr_value加上引号

字符.attr_name="'subTitle'", attr_value="'选择图层'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'description'", attr_value=[{'component': 'fac.AntdDivider', 'children': '图层'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdCascader', 'id': 'fig-axes-cascader', 'placeholder': '选择图层对象', 'expandTrigger': 'hover', 'options': [{'keep-dict-unrendered': True, 'label': '图片-1', 'value': '图片-1', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-2', 'value': '图片-2', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-3', 'value': '图片-3', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-4', 'value': '图片-4', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}]}, {'component': 'fac.AntdText', 'id': 'current-ax', 'keyboard': True, 'children': None, 'style': {'font-size': 18}}], 'style': {'display': 'flex', 'justifyContent': 'center', 'alignItems': 'center', 'height': 200}}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdDivider', 'children': '图层'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdDivider',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdDivider'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='children', attr_value='图层',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'图层'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdCascader', 'id': 'fig-axes-cascader', 'placeholder': '选择图层对象', 'expandTrigger': 'hover', 'options': [{'keep-dict-unrendered': True, 'label': '图片-1', 'value': '图片-1', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-2', 'value': '图片-2', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-3', 'value': '图片-3', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-4', 'value': '图片-4', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}]}, {'component': 'fac.AntdText', 'id': 'current-ax', 'keyboard': True, 'children': None, 'style': {'font-size': 18}}], 'style': {'display': 'flex', 'justifyContent': 'center', 'alignItems': 'center', 'height': 200}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdSpace',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdSpace'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'fac.AntdCascader', 'id': 'fig-axes-cascader', 'placeholder': '选择图层对象', 'expandTrigger': 'hover', 'options': [{'keep-dict-unrendered': True, 'label': '图片-1', 'value': '图片-1', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-2', 'value': '图片-2', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-3', 'value': '图片-3', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-4', 'value': '图片-4', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}]}, {'component': 'fac.AntdText', 'id': 'current-ax', 'keyboard': True, 'children': None, 'style': {'font-size': 18}}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdCascader', 'id': 'fig-axes-cascader', 'placeholder': '选择图层对象', 'expandTrigger': 'hover', 'options': [{'keep-dict-unrendered': True, 'label': '图片-1', 'value': '图片-1', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-2', 'value': '图片-2', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-3', 'value': '图片-3', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-4', 'value': '图片-4', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}]},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdCascader',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdCascader'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='id', attr_value='fig-axes-cascader',attr_value不是函数,attr_value加上引号

字符.attr_name='id', attr_value="'fig-axes-cascader'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='placeholder', attr_value='选择图层对象',attr_value不是函数,attr_value加上引号

字符.attr_name='placeholder', attr_value="'选择图层对象'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='expandTrigger', attr_value='hover',attr_value不是函数,attr_value加上引号

字符.attr_name='expandTrigger', attr_value="'hover'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表.attr_name='options', attr_value=[{'keep-dict-unrendered': True, 'label': '图片-1', 'value': '图片-1', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-2', 'value': '图片-2', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-3', 'value': '图片-3', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-4', 'value': '图片-4', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '图片-1', 'value': '图片-1', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='图片-1',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'图片-1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='图片-1',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'图片-1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'children'", attr_value=[{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-1',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-1',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-2',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-2',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-3',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-3',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-4',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-4'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-4',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-4'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='对角线',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'对角线'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='对角线',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'对角线'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='箱形图',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'箱形图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='箱形图',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'箱形图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='热图',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'热图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='热图',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'热图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='坐标轴',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'坐标轴'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='坐标轴',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'坐标轴'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='图注',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'图注'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='图注',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'图注'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}],
渲染后:items="{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}",以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '图片-2', 'value': '图片-2', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='图片-2',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'图片-2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='图片-2',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'图片-2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'children'", attr_value=[{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-1',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-1',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-2',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-2',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-3',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-3',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-4',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-4'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-4',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-4'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='对角线',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'对角线'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='对角线',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'对角线'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='箱形图',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'箱形图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='箱形图',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'箱形图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='热图',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'热图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='热图',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'热图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='坐标轴',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'坐标轴'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='坐标轴',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'坐标轴'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='图注',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'图注'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='图注',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'图注'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}],
渲染后:items="{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}",以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '图片-3', 'value': '图片-3', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='图片-3',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'图片-3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='图片-3',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'图片-3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'children'", attr_value=[{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-1',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-1',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-2',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-2',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-3',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-3',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-4',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-4'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-4',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-4'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='对角线',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'对角线'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='对角线',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'对角线'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='箱形图',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'箱形图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='箱形图',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'箱形图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='热图',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'热图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='热图',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'热图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='坐标轴',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'坐标轴'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='坐标轴',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'坐标轴'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='图注',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'图注'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='图注',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'图注'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}],
渲染后:items="{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}",以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '图片-4', 'value': '图片-4', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='图片-4',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'图片-4'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='图片-4',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'图片-4'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'children'", attr_value=[{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-1',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-1',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-2',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-2',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-3',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-3',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-4',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-4'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-4',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-4'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='对角线',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'对角线'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='对角线',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'对角线'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='箱形图',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'箱形图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='箱形图',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'箱形图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='热图',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'热图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='热图',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'热图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='坐标轴',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'坐标轴'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='坐标轴',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'坐标轴'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='图注',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'图注'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='图注',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'图注'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}],
渲染后:items="{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}",以`attr_name : attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'label': '图片-1', 'value': '图片-1', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-2', 'value': '图片-2', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-3', 'value': '图片-3', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-4', 'value': '图片-4', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}],
渲染后:items="{'label' : '图片-1', 'value' : '图片-1', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}, {'label' : '图片-2', 'value' : '图片-2', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}, {'label' : '图片-3', 'value' : '图片-3', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}, {'label' : '图片-4', 'value' : '图片-4', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}",以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdText', 'id': 'current-ax', 'keyboard': True, 'children': None, 'style': {'font-size': 18}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdText',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdText'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='id', attr_value='current-ax',attr_value不是函数,attr_value加上引号

字符.attr_name='id', attr_value="'current-ax'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

整数.attr_name='keyboard', attr_value=True,attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表添加至组件列表

None.attr_name='children', attr_value=None, attr_value是空对象,不渲染,不添加

字典.attr_name='style', attr_value={'font-size': 18},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdCascader', 'id': 'fig-axes-cascader', 'placeholder': '选择图层对象', 'expandTrigger': 'hover', 'options': [{'label': '图片-1', 'value': '图片-1', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-2', 'value': '图片-2', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-3', 'value': '图片-3', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-4', 'value': '图片-4', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}]}, {'component': 'fac.AntdText', 'id': 'current-ax', 'keyboard': True, 'children': None, 'style': {'font-size': 18}}],
渲染后:items="fac.AntdCascader(id = 'fig-axes-cascader', placeholder = '选择图层对象', expandTrigger = 'hover', options = [{'label' : '图片-1', 'value' : '图片-1', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}, {'label' : '图片-2', 'value' : '图片-2', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}, {'label' : '图片-3', 'value' : '图片-3', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}, {'label' : '图片-4', 'value' : '图片-4', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}]), fac.AntdText(id = 'current-ax', keyboard = True, style = {'font-size': 18})",以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'display': 'flex', 'justifyContent': 'center', 'alignItems': 'center', 'height': 200},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdDivider', 'children': '图层'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdCascader', 'id': 'fig-axes-cascader', 'placeholder': '选择图层对象', 'expandTrigger': 'hover', 'options': [{'label': '图片-1', 'value': '图片-1', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-2', 'value': '图片-2', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-3', 'value': '图片-3', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-4', 'value': '图片-4', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}]}, {'component': 'fac.AntdText', 'id': 'current-ax', 'keyboard': True, 'children': None, 'style': {'font-size': 18}}], 'style': {'display': 'flex', 'justifyContent': 'center', 'alignItems': 'center', 'height': 200}}],
渲染后:items="fac.AntdDivider(children = '图层'), fac.AntdSpace(children = [fac.AntdCascader(id = 'fig-axes-cascader', placeholder = '选择图层对象', expandTrigger = 'hover', options = [{'label' : '图片-1', 'value' : '图片-1', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}, {'label' : '图片-2', 'value' : '图片-2', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}, {'label' : '图片-3', 'value' : '图片-3', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}, {'label' : '图片-4', 'value' : '图片-4', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}]), fac.AntdText(id = 'current-ax', keyboard = True, style = {'font-size': 18})], style = {'display': 'flex', 'justifyContent': 'center', 'alignItems': 'center', 'height': 200})",以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'title': '步骤2', 'subTitle': '上传数据', 'description': [{'component': 'fac.AntdDivider', 'children': '上传数据'}, {'component': 'fac.AntdDraggerUpload', 'id': 'upload-raw-data', 'apiUrl': '/upload/', 'fileMaxSize': 10, 'fileTypes': ['csv', 'xls', 'xlsx'], 'text': '请上传csv, xls或xlsx文件', 'hint': '选择Axes对象后,点击或拖拽文件至此处进行上传。', 'showUploadList': False, 'disabled': True}, {'component': 'fac.AntdTable', 'id': 'upload-raw-data-table'}]},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'title'", attr_value='步骤2',attr_value不是函数,attr_value加上引号

字符.attr_name="'title'", attr_value="'步骤2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'subTitle'", attr_value='上传数据',attr_value不是函数,attr_value加上引号

字符.attr_name="'subTitle'", attr_value="'上传数据'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'description'", attr_value=[{'component': 'fac.AntdDivider', 'children': '上传数据'}, {'component': 'fac.AntdDraggerUpload', 'id': 'upload-raw-data', 'apiUrl': '/upload/', 'fileMaxSize': 10, 'fileTypes': ['csv', 'xls', 'xlsx'], 'text': '请上传csv, xls或xlsx文件', 'hint': '选择Axes对象后,点击或拖拽文件至此处进行上传。', 'showUploadList': False, 'disabled': True}, {'component': 'fac.AntdTable', 'id': 'upload-raw-data-table'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdDivider', 'children': '上传数据'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdDivider',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdDivider'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='children', attr_value='上传数据',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'上传数据'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdDraggerUpload', 'id': 'upload-raw-data', 'apiUrl': '/upload/', 'fileMaxSize': 10, 'fileTypes': ['csv', 'xls', 'xlsx'], 'text': '请上传csv, xls或xlsx文件', 'hint': '选择Axes对象后,点击或拖拽文件至此处进行上传。', 'showUploadList': False, 'disabled': True},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdDraggerUpload',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdDraggerUpload'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='id', attr_value='upload-raw-data',attr_value不是函数,attr_value加上引号

字符.attr_name='id', attr_value="'upload-raw-data'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='apiUrl', attr_value='/upload/',attr_value不是函数,attr_value加上引号

字符.attr_name='apiUrl', attr_value="'/upload/'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

整数.attr_name='fileMaxSize', attr_value=10,attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表添加至组件列表

列表.attr_name='fileTypes', attr_value=['csv', 'xls', 'xlsx'],attr_value的元素不是字典(以第1个元素判断),以`attr_name=attr_value`形式添加至组件列表

字符.attr_name='text', attr_value='请上传csv, xls或xlsx文件',attr_value不是函数,attr_value加上引号

字符.attr_name='text', attr_value="'请上传csv, xls或xlsx文件'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='hint', attr_value='选择Axes对象后,点击或拖拽文件至此处进行上传。',attr_value不是函数,attr_value加上引号

字符.attr_name='hint', attr_value="'选择Axes对象后,点击或拖拽文件至此处进行上传。'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

整数.attr_name='showUploadList', attr_value=False,attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表添加至组件列表

整数.attr_name='disabled', attr_value=True,attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdTable', 'id': 'upload-raw-data-table'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdTable',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdTable'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='id', attr_value='upload-raw-data-table',attr_value不是函数,attr_value加上引号

字符.attr_name='id', attr_value="'upload-raw-data-table'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdDivider', 'children': '上传数据'}, {'component': 'fac.AntdDraggerUpload', 'id': 'upload-raw-data', 'apiUrl': '/upload/', 'fileMaxSize': 10, 'fileTypes': ['csv', 'xls', 'xlsx'], 'text': '请上传csv, xls或xlsx文件', 'hint': '选择Axes对象后,点击或拖拽文件至此处进行上传。', 'showUploadList': False, 'disabled': True}, {'component': 'fac.AntdTable', 'id': 'upload-raw-data-table'}],
渲染后:items="fac.AntdDivider(children = '上传数据'), fac.AntdDraggerUpload(id = 'upload-raw-data', apiUrl = '/upload/', fileMaxSize = 10, fileTypes = ['csv', 'xls', 'xlsx'], text = '请上传csv, xls或xlsx文件', hint = '选择Axes对象后,点击或拖拽文件至此处进行上传。', showUploadList = False, disabled = True), fac.AntdTable(id = 'upload-raw-data-table')",以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'title': '步骤3', 'subTitle': '计算统计量', 'description': [{'component': 'fac.AntdDivider', 'children': '计算统计量'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择结局变量和自变量', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'options': None, 'placeholder': '选择结局变量(二分类因变量)', 'id': 'outcome-variable', 'style': {'width': 600}}, {'component': 'fac.AntdTransfer', 'titles': ['候选自变量', '选定自变量'], 'dataSource': None, 'targetKeys': None, 'showSearch': True, 'operations': ['放入', '移出'], 'id': 'independent-variable', 'height': 600, 'style': {'width': 600}}, {'component': 'fac.AntdSelect', 'id': 'fit-model', 'placeholder': '选择学习模型', 'options': [{'keep-dict-unrendered': True, 'label': '逻辑回归', 'value': 'LogisticRegression'}, {'keep-dict-unrendered': True, 'label': '随机森林', 'value': 'RandomForestClassifier'}], 'style': {'width': 200}}, {'component': 'fac.AntdButton', 'children': '计算统计量', 'id': 'calculate-statistics', 'autoSpin': True, 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '计算结果', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'id': 'calculated-statistical-result', 'children': []}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'center', 'alignItems': 'center'}}]},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'title'", attr_value='步骤3',attr_value不是函数,attr_value加上引号

字符.attr_name="'title'", attr_value="'步骤3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'subTitle'", attr_value='计算统计量',attr_value不是函数,attr_value加上引号

字符.attr_name="'subTitle'", attr_value="'计算统计量'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'description'", attr_value=[{'component': 'fac.AntdDivider', 'children': '计算统计量'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择结局变量和自变量', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'options': None, 'placeholder': '选择结局变量(二分类因变量)', 'id': 'outcome-variable', 'style': {'width': 600}}, {'component': 'fac.AntdTransfer', 'titles': ['候选自变量', '选定自变量'], 'dataSource': None, 'targetKeys': None, 'showSearch': True, 'operations': ['放入', '移出'], 'id': 'independent-variable', 'height': 600, 'style': {'width': 600}}, {'component': 'fac.AntdSelect', 'id': 'fit-model', 'placeholder': '选择学习模型', 'options': [{'keep-dict-unrendered': True, 'label': '逻辑回归', 'value': 'LogisticRegression'}, {'keep-dict-unrendered': True, 'label': '随机森林', 'value': 'RandomForestClassifier'}], 'style': {'width': 200}}, {'component': 'fac.AntdButton', 'children': '计算统计量', 'id': 'calculate-statistics', 'autoSpin': True, 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '计算结果', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'id': 'calculated-statistical-result', 'children': []}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'center', 'alignItems': 'center'}}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdDivider', 'children': '计算统计量'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdDivider',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdDivider'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='children', attr_value='计算统计量',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'计算统计量'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择结局变量和自变量', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'options': None, 'placeholder': '选择结局变量(二分类因变量)', 'id': 'outcome-variable', 'style': {'width': 600}}, {'component': 'fac.AntdTransfer', 'titles': ['候选自变量', '选定自变量'], 'dataSource': None, 'targetKeys': None, 'showSearch': True, 'operations': ['放入', '移出'], 'id': 'independent-variable', 'height': 600, 'style': {'width': 600}}, {'component': 'fac.AntdSelect', 'id': 'fit-model', 'placeholder': '选择学习模型', 'options': [{'keep-dict-unrendered': True, 'label': '逻辑回归', 'value': 'LogisticRegression'}, {'keep-dict-unrendered': True, 'label': '随机森林', 'value': 'RandomForestClassifier'}], 'style': {'width': 200}}, {'component': 'fac.AntdButton', 'children': '计算统计量', 'id': 'calculate-statistics', 'autoSpin': True, 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '计算结果', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'id': 'calculated-statistical-result', 'children': []}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'center', 'alignItems': 'center'}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdSpace',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdSpace'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择结局变量和自变量', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'options': None, 'placeholder': '选择结局变量(二分类因变量)', 'id': 'outcome-variable', 'style': {'width': 600}}, {'component': 'fac.AntdTransfer', 'titles': ['候选自变量', '选定自变量'], 'dataSource': None, 'targetKeys': None, 'showSearch': True, 'operations': ['放入', '移出'], 'id': 'independent-variable', 'height': 600, 'style': {'width': 600}}, {'component': 'fac.AntdSelect', 'id': 'fit-model', 'placeholder': '选择学习模型', 'options': [{'keep-dict-unrendered': True, 'label': '逻辑回归', 'value': 'LogisticRegression'}, {'keep-dict-unrendered': True, 'label': '随机森林', 'value': 'RandomForestClassifier'}], 'style': {'width': 200}}, {'component': 'fac.AntdButton', 'children': '计算统计量', 'id': 'calculate-statistics', 'autoSpin': True, 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '计算结果', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'id': 'calculated-statistical-result', 'children': []}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择结局变量和自变量', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='html.Div',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'html.Div'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'fac.AntdDivider', 'children': '选择结局变量和自变量', 'innerTextOrientation': 'left'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdDivider', 'children': '选择结局变量和自变量', 'innerTextOrientation': 'left'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdDivider',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdDivider'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='children', attr_value='选择结局变量和自变量',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'选择结局变量和自变量'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='innerTextOrientation', attr_value='left',attr_value不是函数,attr_value加上引号

字符.attr_name='innerTextOrientation', attr_value="'left'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdDivider', 'children': '选择结局变量和自变量', 'innerTextOrientation': 'left'}],
渲染后:items="fac.AntdDivider(children = '选择结局变量和自变量', innerTextOrientation = 'left')",以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'width': 1000},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdSelect', 'options': None, 'placeholder': '选择结局变量(二分类因变量)', 'id': 'outcome-variable', 'style': {'width': 600}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdSelect',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdSelect'",attr_name属于排除对象,不添加至组件列表

None.attr_name='options', attr_value=None, attr_value是空对象,不渲染,不添加

字符.attr_name='placeholder', attr_value='选择结局变量(二分类因变量)',attr_value不是函数,attr_value加上引号

字符.attr_name='placeholder', attr_value="'选择结局变量(二分类因变量)'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='id', attr_value='outcome-variable',attr_value不是函数,attr_value加上引号

字符.attr_name='id', attr_value="'outcome-variable'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'width': 600},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdTransfer', 'titles': ['候选自变量', '选定自变量'], 'dataSource': None, 'targetKeys': None, 'showSearch': True, 'operations': ['放入', '移出'], 'id': 'independent-variable', 'height': 600, 'style': {'width': 600}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdTransfer',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdTransfer'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='titles', attr_value=['候选自变量', '选定自变量'],attr_value的元素不是字典(以第1个元素判断),以`attr_name=attr_value`形式添加至组件列表

None.attr_name='dataSource', attr_value=None, attr_value是空对象,不渲染,不添加

None.attr_name='targetKeys', attr_value=None, attr_value是空对象,不渲染,不添加

整数.attr_name='showSearch', attr_value=True,attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表添加至组件列表

列表.attr_name='operations', attr_value=['放入', '移出'],attr_value的元素不是字典(以第1个元素判断),以`attr_name=attr_value`形式添加至组件列表

字符.attr_name='id', attr_value='independent-variable',attr_value不是函数,attr_value加上引号

字符.attr_name='id', attr_value="'independent-variable'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

整数.attr_name='height', attr_value=600,attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表添加至组件列表

字典.attr_name='style', attr_value={'width': 600},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdSelect', 'id': 'fit-model', 'placeholder': '选择学习模型', 'options': [{'keep-dict-unrendered': True, 'label': '逻辑回归', 'value': 'LogisticRegression'}, {'keep-dict-unrendered': True, 'label': '随机森林', 'value': 'RandomForestClassifier'}], 'style': {'width': 200}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdSelect',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdSelect'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='id', attr_value='fit-model',attr_value不是函数,attr_value加上引号

字符.attr_name='id', attr_value="'fit-model'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='placeholder', attr_value='选择学习模型',attr_value不是函数,attr_value加上引号

字符.attr_name='placeholder', attr_value="'选择学习模型'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表.attr_name='options', attr_value=[{'keep-dict-unrendered': True, 'label': '逻辑回归', 'value': 'LogisticRegression'}, {'keep-dict-unrendered': True, 'label': '随机森林', 'value': 'RandomForestClassifier'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '逻辑回归', 'value': 'LogisticRegression'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='逻辑回归',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'逻辑回归'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='LogisticRegression',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'LogisticRegression'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '随机森林', 'value': 'RandomForestClassifier'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='随机森林',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'随机森林'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='RandomForestClassifier',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'RandomForestClassifier'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'label': '逻辑回归', 'value': 'LogisticRegression'}, {'label': '随机森林', 'value': 'RandomForestClassifier'}],
渲染后:items="{'label' : '逻辑回归', 'value' : 'LogisticRegression'}, {'label' : '随机森林', 'value' : 'RandomForestClassifier'}",以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'width': 200},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdButton', 'children': '计算统计量', 'id': 'calculate-statistics', 'autoSpin': True, 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdButton',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdButton'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='children', attr_value='计算统计量',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'计算统计量'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='id', attr_value='calculate-statistics',attr_value不是函数,attr_value加上引号

字符.attr_name='id', attr_value="'calculate-statistics'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

整数.attr_name='autoSpin', attr_value=True,attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表添加至组件列表

字符.attr_name='type', attr_value='primary',attr_value不是函数,attr_value加上引号

字符.attr_name='type', attr_value="'primary'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表.attr_name='icon', attr_value=[{'component': 'fac.AntdIcon', 'icon': 'md-layers'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdIcon', 'icon': 'md-layers'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdIcon',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdIcon'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='icon', attr_value='md-layers',attr_value不是函数,attr_value加上引号

字符.attr_name='icon', attr_value="'md-layers'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdIcon', 'icon': 'md-layers'}],
渲染后:items="fac.AntdIcon(icon = 'md-layers')",以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '计算结果', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='html.Div',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'html.Div'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'fac.AntdDivider', 'children': '计算结果', 'innerTextOrientation': 'left'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdDivider', 'children': '计算结果', 'innerTextOrientation': 'left'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdDivider',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdDivider'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='children', attr_value='计算结果',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'计算结果'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='innerTextOrientation', attr_value='left',attr_value不是函数,attr_value加上引号

字符.attr_name='innerTextOrientation', attr_value="'left'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdDivider', 'children': '计算结果', 'innerTextOrientation': 'left'}],
渲染后:items="fac.AntdDivider(children = '计算结果', innerTextOrientation = 'left')",以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'width': 1000},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'html.Div', 'id': 'calculated-statistical-result', 'children': []},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='html.Div',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'html.Div'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='id', attr_value='calculated-statistical-result',attr_value不是函数,attr_value加上引号

字符.attr_name='id', attr_value="'calculated-statistical-result'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表.attr_name='children', attr_value=[],attr_value是空值,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择结局变量和自变量', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'options': None, 'placeholder': '选择结局变量(二分类因变量)', 'id': 'outcome-variable', 'style': {'width': 600}}, {'component': 'fac.AntdTransfer', 'titles': ['候选自变量', '选定自变量'], 'dataSource': None, 'targetKeys': None, 'showSearch': True, 'operations': ['放入', '移出'], 'id': 'independent-variable', 'height': 600, 'style': {'width': 600}}, {'component': 'fac.AntdSelect', 'id': 'fit-model', 'placeholder': '选择学习模型', 'options': [{'label': '逻辑回归', 'value': 'LogisticRegression'}, {'label': '随机森林', 'value': 'RandomForestClassifier'}], 'style': {'width': 200}}, {'component': 'fac.AntdButton', 'children': '计算统计量', 'id': 'calculate-statistics', 'autoSpin': True, 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '计算结果', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'id': 'calculated-statistical-result', 'children': []}],
渲染后:items="html.Div(children = [fac.AntdDivider(children = '选择结局变量和自变量', innerTextOrientation = 'left')], style = {'width': 1000}), fac.AntdSelect(placeholder = '选择结局变量(二分类因变量)', id = 'outcome-variable', style = {'width': 600}), fac.AntdTransfer(titles = ['候选自变量', '选定自变量'], showSearch = True, operations = ['放入', '移出'], id = 'independent-variable', height = 600, style = {'width': 600}), fac.AntdSelect(id = 'fit-model', placeholder = '选择学习模型', options = [{'label' : '逻辑回归', 'value' : 'LogisticRegression'}, {'label' : '随机森林', 'value' : 'RandomForestClassifier'}], style = {'width': 200}), fac.AntdButton(children = '计算统计量', id = 'calculate-statistics', autoSpin = True, type = 'primary', icon = [fac.AntdIcon(icon = 'md-layers')]), html.Div(children = [fac.AntdDivider(children = '计算结果', innerTextOrientation = 'left')], style = {'width': 1000}), html.Div(id = 'calculated-statistical-result', children = [])",以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='direction', attr_value='vertical',attr_value不是函数,attr_value加上引号

字符.attr_name='direction', attr_value="'vertical'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'display': 'flex', 'justifyContent': 'center', 'alignItems': 'center'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdDivider', 'children': '计算统计量'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择结局变量和自变量', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'options': None, 'placeholder': '选择结局变量(二分类因变量)', 'id': 'outcome-variable', 'style': {'width': 600}}, {'component': 'fac.AntdTransfer', 'titles': ['候选自变量', '选定自变量'], 'dataSource': None, 'targetKeys': None, 'showSearch': True, 'operations': ['放入', '移出'], 'id': 'independent-variable', 'height': 600, 'style': {'width': 600}}, {'component': 'fac.AntdSelect', 'id': 'fit-model', 'placeholder': '选择学习模型', 'options': [{'label': '逻辑回归', 'value': 'LogisticRegression'}, {'label': '随机森林', 'value': 'RandomForestClassifier'}], 'style': {'width': 200}}, {'component': 'fac.AntdButton', 'children': '计算统计量', 'id': 'calculate-statistics', 'autoSpin': True, 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '计算结果', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'id': 'calculated-statistical-result', 'children': []}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'center', 'alignItems': 'center'}}],
渲染后:items="fac.AntdDivider(children = '计算统计量'), fac.AntdSpace(children = [html.Div(children = [fac.AntdDivider(children = '选择结局变量和自变量', innerTextOrientation = 'left')], style = {'width': 1000}), fac.AntdSelect(placeholder = '选择结局变量(二分类因变量)', id = 'outcome-variable', style = {'width': 600}), fac.AntdTransfer(titles = ['候选自变量', '选定自变量'], showSearch = True, operations = ['放入', '移出'], id = 'independent-variable', height = 600, style = {'width': 600}), fac.AntdSelect(id = 'fit-model', placeholder = '选择学习模型', options = [{'label' : '逻辑回归', 'value' : 'LogisticRegression'}, {'label' : '随机森林', 'value' : 'RandomForestClassifier'}], style = {'width': 200}), fac.AntdButton(children = '计算统计量', id = 'calculate-statistics', autoSpin = True, type = 'primary', icon = [fac.AntdIcon(icon = 'md-layers')]), html.Div(children = [fac.AntdDivider(children = '计算结果', innerTextOrientation = 'left')], style = {'width': 1000}), html.Div(id = 'calculated-statistical-result', children = [])], direction = 'vertical', style = {'display': 'flex', 'justifyContent': 'center', 'alignItems': 'center'})",以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'title': '步骤4', 'subTitle': '设定图层参数', 'description': [{'component': 'fac.AntdDivider', 'children': '图层参数'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '图片格式', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'id': {'type': 'update-plot-params-value', 'index': 'theme-style'}, 'options': "f(generate_attr_dict_from_str_list, str_list = plt.style.available, dict_keys = ['label', 'value'])", 'placeholder': '选择主题', 'style': {'width': 300}}], 'direction': 'vertical'}, {'component': 'fac.AntdSpace', 'id': 'roc-ax-params', 'style': {'display': 'none'}, 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': 'ROC图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'roc'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'roc'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'roc'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'roc'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'roc'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'roc'}, 'defaultValue': '#1864ab', 'options': [{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '曲线平滑度', 'keyboard': True, 'style': {'font-size': 18, 'marginTop': '10px'}}, {'component': 'fac.AntdCheckbox', 'id': {'type': 'update-plot-params-check', 'index': 'smooth-line'}, 'label': '平滑', 'style': {'marginTop': '10px'}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'id': {'type': 'update-plot-params-value', 'index': 'line-width-roc'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'style': {'marginTop': '10px'}}]}], 'direction': 'vertical'}, {'component': 'fac.AntdSpace', 'id': 'diagonal-ax-params', 'style': {'display': 'none'}, 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '对角线图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'diagonal'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'diagonal'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'diagonal'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'diagonal'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'diagonal'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'diagonal'}, 'defaultValue': '#1864ab', 'options': [{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'id': {'type': 'update-plot-params-value', 'index': 'line-width-diagonal'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'style': {'marginTop': '10px'}}]}], 'direction': 'vertical'}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center'}}]},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'title'", attr_value='步骤4',attr_value不是函数,attr_value加上引号

字符.attr_name="'title'", attr_value="'步骤4'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'subTitle'", attr_value='设定图层参数',attr_value不是函数,attr_value加上引号

字符.attr_name="'subTitle'", attr_value="'设定图层参数'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'description'", attr_value=[{'component': 'fac.AntdDivider', 'children': '图层参数'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '图片格式', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'id': {'type': 'update-plot-params-value', 'index': 'theme-style'}, 'options': "f(generate_attr_dict_from_str_list, str_list = plt.style.available, dict_keys = ['label', 'value'])", 'placeholder': '选择主题', 'style': {'width': 300}}], 'direction': 'vertical'}, {'component': 'fac.AntdSpace', 'id': 'roc-ax-params', 'style': {'display': 'none'}, 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': 'ROC图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'roc'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'roc'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'roc'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'roc'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'roc'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'roc'}, 'defaultValue': '#1864ab', 'options': [{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '曲线平滑度', 'keyboard': True, 'style': {'font-size': 18, 'marginTop': '10px'}}, {'component': 'fac.AntdCheckbox', 'id': {'type': 'update-plot-params-check', 'index': 'smooth-line'}, 'label': '平滑', 'style': {'marginTop': '10px'}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'id': {'type': 'update-plot-params-value', 'index': 'line-width-roc'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'style': {'marginTop': '10px'}}]}], 'direction': 'vertical'}, {'component': 'fac.AntdSpace', 'id': 'diagonal-ax-params', 'style': {'display': 'none'}, 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '对角线图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'diagonal'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'diagonal'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'diagonal'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'diagonal'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'diagonal'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'diagonal'}, 'defaultValue': '#1864ab', 'options': [{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'id': {'type': 'update-plot-params-value', 'index': 'line-width-diagonal'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'style': {'marginTop': '10px'}}]}], 'direction': 'vertical'}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center'}}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdDivider', 'children': '图层参数'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdDivider',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdDivider'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='children', attr_value='图层参数',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'图层参数'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '图片格式', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'id': {'type': 'update-plot-params-value', 'index': 'theme-style'}, 'options': "f(generate_attr_dict_from_str_list, str_list = plt.style.available, dict_keys = ['label', 'value'])", 'placeholder': '选择主题', 'style': {'width': 300}}], 'direction': 'vertical'}, {'component': 'fac.AntdSpace', 'id': 'roc-ax-params', 'style': {'display': 'none'}, 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': 'ROC图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'roc'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'roc'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'roc'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'roc'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'roc'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'roc'}, 'defaultValue': '#1864ab', 'options': [{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '曲线平滑度', 'keyboard': True, 'style': {'font-size': 18, 'marginTop': '10px'}}, {'component': 'fac.AntdCheckbox', 'id': {'type': 'update-plot-params-check', 'index': 'smooth-line'}, 'label': '平滑', 'style': {'marginTop': '10px'}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'id': {'type': 'update-plot-params-value', 'index': 'line-width-roc'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'style': {'marginTop': '10px'}}]}], 'direction': 'vertical'}, {'component': 'fac.AntdSpace', 'id': 'diagonal-ax-params', 'style': {'display': 'none'}, 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '对角线图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'diagonal'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'diagonal'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'diagonal'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'diagonal'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'diagonal'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'diagonal'}, 'defaultValue': '#1864ab', 'options': [{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'id': {'type': 'update-plot-params-value', 'index': 'line-width-diagonal'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'style': {'marginTop': '10px'}}]}], 'direction': 'vertical'}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center'}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdSpace',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdSpace'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '图片格式', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'id': {'type': 'update-plot-params-value', 'index': 'theme-style'}, 'options': "f(generate_attr_dict_from_str_list, str_list = plt.style.available, dict_keys = ['label', 'value'])", 'placeholder': '选择主题', 'style': {'width': 300}}], 'direction': 'vertical'}, {'component': 'fac.AntdSpace', 'id': 'roc-ax-params', 'style': {'display': 'none'}, 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': 'ROC图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'roc'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'roc'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'roc'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'roc'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'roc'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'roc'}, 'defaultValue': '#1864ab', 'options': [{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '曲线平滑度', 'keyboard': True, 'style': {'font-size': 18, 'marginTop': '10px'}}, {'component': 'fac.AntdCheckbox', 'id': {'type': 'update-plot-params-check', 'index': 'smooth-line'}, 'label': '平滑', 'style': {'marginTop': '10px'}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'id': {'type': 'update-plot-params-value', 'index': 'line-width-roc'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'style': {'marginTop': '10px'}}]}], 'direction': 'vertical'}, {'component': 'fac.AntdSpace', 'id': 'diagonal-ax-params', 'style': {'display': 'none'}, 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '对角线图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'diagonal'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'diagonal'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'diagonal'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'diagonal'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'diagonal'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'diagonal'}, 'defaultValue': '#1864ab', 'options': [{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'id': {'type': 'update-plot-params-value', 'index': 'line-width-diagonal'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'style': {'marginTop': '10px'}}]}], 'direction': 'vertical'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '图片格式', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'id': {'type': 'update-plot-params-value', 'index': 'theme-style'}, 'options': "f(generate_attr_dict_from_str_list, str_list = plt.style.available, dict_keys = ['label', 'value'])", 'placeholder': '选择主题', 'style': {'width': 300}}], 'direction': 'vertical'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdSpace',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdSpace'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '图片格式', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'id': {'type': 'update-plot-params-value', 'index': 'theme-style'}, 'options': "f(generate_attr_dict_from_str_list, str_list = plt.style.available, dict_keys = ['label', 'value'])", 'placeholder': '选择主题', 'style': {'width': 300}}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '图片格式', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='html.Div',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'html.Div'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'fac.AntdDivider', 'children': '图片格式', 'innerTextOrientation': 'left'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdDivider', 'children': '图片格式', 'innerTextOrientation': 'left'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdDivider',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdDivider'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='children', attr_value='图片格式',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'图片格式'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='innerTextOrientation', attr_value='left',attr_value不是函数,attr_value加上引号

字符.attr_name='innerTextOrientation', attr_value="'left'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdDivider', 'children': '图片格式', 'innerTextOrientation': 'left'}],
渲染后:items="fac.AntdDivider(children = '图片格式', innerTextOrientation = 'left')",以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'width': 1000},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdSelect', 'id': {'type': 'update-plot-params-value', 'index': 'theme-style'}, 'options': "f(generate_attr_dict_from_str_list, str_list = plt.style.available, dict_keys = ['label', 'value'])", 'placeholder': '选择主题', 'style': {'width': 300}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdSelect',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdSelect'",attr_name属于排除对象,不添加至组件列表

字典.attr_name='id', attr_value={'type': 'update-plot-params-value', 'index': 'theme-style'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='options', attr_value="f(generate_attr_dict_from_str_list, str_list = plt.style.available, dict_keys = ['label', 'value'])",attr_value是函数,attr_value渲染成函数

字符.attr_name='options', attr_value="generate_attr_dict_from_str_list( str_list = plt.style.available, dict_keys = ['label', 'value'])",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='placeholder', attr_value='选择主题',attr_value不是函数,attr_value加上引号

字符.attr_name='placeholder', attr_value="'选择主题'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'width': 300},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '图片格式', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'id': {'type': 'update-plot-params-value', 'index': 'theme-style'}, 'options': "f(generate_attr_dict_from_str_list, str_list = plt.style.available, dict_keys = ['label', 'value'])", 'placeholder': '选择主题', 'style': {'width': 300}}],
渲染后:items="html.Div(children = [fac.AntdDivider(children = '图片格式', innerTextOrientation = 'left')], style = {'width': 1000}), fac.AntdSelect(id = {'type': 'update-plot-params-value', 'index': 'theme-style'}, options = generate_attr_dict_from_str_list( str_list = plt.style.available, dict_keys = ['label', 'value']), placeholder = '选择主题', style = {'width': 300})",以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='direction', attr_value='vertical',attr_value不是函数,attr_value加上引号

字符.attr_name='direction', attr_value="'vertical'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdSpace', 'id': 'roc-ax-params', 'style': {'display': 'none'}, 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': 'ROC图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'roc'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'roc'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'roc'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'roc'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'roc'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'roc'}, 'defaultValue': '#1864ab', 'options': [{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '曲线平滑度', 'keyboard': True, 'style': {'font-size': 18, 'marginTop': '10px'}}, {'component': 'fac.AntdCheckbox', 'id': {'type': 'update-plot-params-check', 'index': 'smooth-line'}, 'label': '平滑', 'style': {'marginTop': '10px'}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'id': {'type': 'update-plot-params-value', 'index': 'line-width-roc'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'style': {'marginTop': '10px'}}]}], 'direction': 'vertical'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdSpace',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdSpace'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='id', attr_value='roc-ax-params',attr_value不是函数,attr_value加上引号

字符.attr_name='id', attr_value="'roc-ax-params'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'display': 'none'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': 'ROC图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'roc'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'roc'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'roc'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'roc'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'roc'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'roc'}, 'defaultValue': '#1864ab', 'options': [{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '曲线平滑度', 'keyboard': True, 'style': {'font-size': 18, 'marginTop': '10px'}}, {'component': 'fac.AntdCheckbox', 'id': {'type': 'update-plot-params-check', 'index': 'smooth-line'}, 'label': '平滑', 'style': {'marginTop': '10px'}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'id': {'type': 'update-plot-params-value', 'index': 'line-width-roc'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'style': {'marginTop': '10px'}}]}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': 'ROC图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='html.Div',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'html.Div'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'fac.AntdDivider', 'children': 'ROC图层参数', 'innerTextOrientation': 'left'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdDivider', 'children': 'ROC图层参数', 'innerTextOrientation': 'left'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdDivider',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdDivider'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='children', attr_value='ROC图层参数',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'ROC图层参数'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='innerTextOrientation', attr_value='left',attr_value不是函数,attr_value加上引号

字符.attr_name='innerTextOrientation', attr_value="'left'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdDivider', 'children': 'ROC图层参数', 'innerTextOrientation': 'left'}],
渲染后:items="fac.AntdDivider(children = 'ROC图层参数', innerTextOrientation = 'left')",以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'width': 1000},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'roc'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'roc'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'roc'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'roc'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'roc'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'roc'}, 'defaultValue': '#1864ab', 'options': [{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdSpace',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdSpace'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'roc'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'roc'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'roc'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'roc'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'roc'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'roc'}, 'defaultValue': '#1864ab', 'options': [{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdText',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdText'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='children', attr_value='颜色',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'颜色'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

整数.attr_name='keyboard', attr_value=True,attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表添加至组件列表

字典.attr_name='style', attr_value={'font-size': 18},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'roc'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdButton',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdButton'",attr_name属于排除对象,不添加至组件列表

字典.attr_name='id', attr_value={'type': 'open-color-palette', 'index': 'roc'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='children', attr_value='调色板',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'调色板'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='type', attr_value='primary',attr_value不是函数,attr_value加上引号

字符.attr_name='type', attr_value="'primary'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表.attr_name='icon', attr_value=[{'component': 'fac.AntdIcon', 'icon': 'md-layers'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdIcon', 'icon': 'md-layers'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdIcon',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdIcon'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='icon', attr_value='md-layers',attr_value不是函数,attr_value加上引号

字符.attr_name='icon', attr_value="'md-layers'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdIcon', 'icon': 'md-layers'}],
渲染后:items="fac.AntdIcon(icon = 'md-layers')",以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'roc'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'roc'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'roc'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'roc'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdModal',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdModal'",attr_name属于排除对象,不添加至组件列表

字典.attr_name='id', attr_value={'type': 'custom-color-picker', 'index': 'roc'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'roc'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'roc'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'roc'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'roc'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'roc'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'roc'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdSpace',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdSpace'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'roc'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'roc'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'roc'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'roc'}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fuc.FefferyWheelColorPicker',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fuc.FefferyWheelColorPicker'",attr_name属于排除对象,不添加至组件列表

字典.attr_name='id', attr_value={'type': 'color-wheel-selector', 'index': 'roc'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'roc'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='html.Div',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'html.Div'",attr_name属于排除对象,不添加至组件列表

字典.attr_name='id', attr_value={'type': 'wheel-color-div', 'index': 'roc'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'roc'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fuc.FefferyTwitterColorPicker',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fuc.FefferyTwitterColorPicker'",attr_name属于排除对象,不添加至组件列表

字典.attr_name='id', attr_value={'type': 'color-twitter-selector', 'index': 'roc'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

列表.attr_name='colors', attr_value=['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10'],attr_value的元素不是字典(以第1个元素判断),以`attr_name=attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'roc'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'roc'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'roc'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}],
渲染后:items='fuc.FefferyWheelColorPicker(id = {\'type\': \'color-wheel-selector\', \'index\': \'roc\'}), html.Div(id = {\'type\': \'wheel-color-div\', \'index\': \'roc\'}, style = {\'width\': \'200px\', \'height\': \'200px\', \'display\': \'flex\', \'alignItems\': \'center\', \'justifyContent\': \'center\', "borderRadius\'": \'5px\', \'boxShadow\': \'0px 0px 12px rgba(0, 0, 0, .12)\', \'transition\': \'0.25s\', \'backround\': \'#fffc51\'}), fuc.FefferyTwitterColorPicker(id = {\'type\': \'color-twitter-selector\', \'index\': \'roc\'}, colors = [\'#fff4ce\', \'#797673\', \'#fed9cc\', \'#d83b01\', \'#fde7e9\', \'#a80000\', \'#dff6dd\', \'#107c10\'])',以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'roc'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'roc'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'roc'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}],
渲染后:items='fac.AntdSpace(children = [fuc.FefferyWheelColorPicker(id = {\'type\': \'color-wheel-selector\', \'index\': \'roc\'}), html.Div(id = {\'type\': \'wheel-color-div\', \'index\': \'roc\'}, style = {\'width\': \'200px\', \'height\': \'200px\', \'display\': \'flex\', \'alignItems\': \'center\', \'justifyContent\': \'center\', "borderRadius\'": \'5px\', \'boxShadow\': \'0px 0px 12px rgba(0, 0, 0, .12)\', \'transition\': \'0.25s\', \'backround\': \'#fffc51\'}), fuc.FefferyTwitterColorPicker(id = {\'type\': \'color-twitter-selector\', \'index\': \'roc\'}, colors = [\'#fff4ce\', \'#797673\', \'#fed9cc\', \'#d83b01\', \'#fde7e9\', \'#a80000\', \'#dff6dd\', \'#107c10\'])])',以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='title', attr_value='选择自定义颜色',attr_value不是函数,attr_value加上引号

字符.attr_name='title', attr_value="'选择自定义颜色'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

整数.attr_name='renderFooter', attr_value=True,attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表添加至组件列表

整数.attr_name='width', attr_value=800,attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'roc'}, 'defaultValue': '#1864ab', 'options': [{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdSelect',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdSelect'",attr_name属于排除对象,不添加至组件列表

字典.attr_name='id', attr_value={'type': 'custom-color-selector', 'index': 'roc'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='defaultValue', attr_value='#1864ab',attr_value不是函数,attr_value加上引号

字符.attr_name='defaultValue', attr_value="'#1864ab'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表.attr_name='options', attr_value=[{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='自定义色',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'自定义色'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='#1864ab',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'#1864ab'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'colors'", attr_value=['#1864ab'],attr_value的元素不是字典(以第1个元素判断),以`attr_name=attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}],
渲染后:items="{'label' : '自定义色', 'value' : '#1864ab', 'colors' : ['#1864ab']}",以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='colorsMode', attr_value='diverging',attr_value不是函数,attr_value加上引号

字符.attr_name='colorsMode', attr_value="'diverging'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

整数.attr_name='disabled', attr_value=False,attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表添加至组件列表

字典.attr_name='style', attr_value={'width': 200},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdSelect',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdSelect'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='defaultValue', attr_value='配色1',attr_value不是函数,attr_value加上引号

字符.attr_name='defaultValue', attr_value="'配色1'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表.attr_name='options', attr_value=[{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='配色1',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'配色1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='配色1',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'配色1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'colors'", attr_value=['#fff5f5', '#ff8787', '#c92a2a'],attr_value的元素不是字典(以第1个元素判断),以`attr_name=attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='配色2',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'配色2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='配色2',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'配色2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'colors'", attr_value=['#f8f0fc', '#da77f2', '#862e9c'],attr_value的元素不是字典(以第1个元素判断),以`attr_name=attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='配色3',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'配色3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='配色3',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'配色3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'colors'", attr_value=['#e7f5ff', '#4dabf7', '#1864ab'],attr_value的元素不是字典(以第1个元素判断),以`attr_name=attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}],
渲染后:items="{'label' : '配色1', 'value' : '配色1', 'colors' : ['#fff5f5', '#ff8787', '#c92a2a']}, {'label' : '配色2', 'value' : '配色2', 'colors' : ['#f8f0fc', '#da77f2', '#862e9c']}, {'label' : '配色3', 'value' : '配色3', 'colors' : ['#e7f5ff', '#4dabf7', '#1864ab']}",以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='colorsMode', attr_value='diverging',attr_value不是函数,attr_value加上引号

字符.attr_name='colorsMode', attr_value="'diverging'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'width': 200},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdSelect',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdSelect'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='defaultValue', attr_value='RGB1',attr_value不是函数,attr_value加上引号

字符.attr_name='defaultValue', attr_value="'RGB1'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表.attr_name='options', attr_value=[{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'group'", attr_value='RGB',attr_value不是函数,attr_value加上引号

字符.attr_name="'group'", attr_value="'RGB'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'options'", attr_value=[{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='颜色1',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'颜色1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='RGB1',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'RGB1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'colors'", attr_value=['#fff5f5'],attr_value的元素不是字典(以第1个元素判断),以`attr_name=attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='颜色2',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'颜色2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='RGB2',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'RGB2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'colors'", attr_value=['#ff8787'],attr_value的元素不是字典(以第1个元素判断),以`attr_name=attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='颜色3',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'颜色3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='RGB3',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'RGB3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'colors'", attr_value=['#c92a2a'],attr_value的元素不是字典(以第1个元素判断),以`attr_name=attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}],
渲染后:items="{'label' : '颜色1', 'value' : 'RGB1', 'colors' : ['#fff5f5']}, {'label' : '颜色2', 'value' : 'RGB2', 'colors' : ['#ff8787']}, {'label' : '颜色3', 'value' : 'RGB3', 'colors' : ['#c92a2a']}",以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'group'", attr_value='HEX',attr_value不是函数,attr_value加上引号

字符.attr_name="'group'", attr_value="'HEX'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'options'", attr_value=[{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='颜色1',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'颜色1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='HEX1',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'HEX1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'colors'", attr_value=['#f8f0fc'],attr_value的元素不是字典(以第1个元素判断),以`attr_name=attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='颜色2',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'颜色2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='HEX2',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'HEX2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'colors'", attr_value=['#da77f2'],attr_value的元素不是字典(以第1个元素判断),以`attr_name=attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='颜色3',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'颜色3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='HEX3',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'HEX3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'colors'", attr_value=['#862e9c'],attr_value的元素不是字典(以第1个元素判断),以`attr_name=attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}],
渲染后:items="{'label' : '颜色1', 'value' : 'HEX1', 'colors' : ['#f8f0fc']}, {'label' : '颜色2', 'value' : 'HEX2', 'colors' : ['#da77f2']}, {'label' : '颜色3', 'value' : 'HEX3', 'colors' : ['#862e9c']}",以`attr_name : attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'group': 'RGB', 'options': [{'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'group': 'HEX', 'options': [{'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}],
渲染后:items="{'group' : 'RGB', 'options' : [{'label' : '颜色1', 'value' : 'RGB1', 'colors' : ['#fff5f5']}, {'label' : '颜色2', 'value' : 'RGB2', 'colors' : ['#ff8787']}, {'label' : '颜色3', 'value' : 'RGB3', 'colors' : ['#c92a2a']}]}, {'group' : 'HEX', 'options' : [{'label' : '颜色1', 'value' : 'HEX1', 'colors' : ['#f8f0fc']}, {'label' : '颜色2', 'value' : 'HEX2', 'colors' : ['#da77f2']}, {'label' : '颜色3', 'value' : 'HEX3', 'colors' : ['#862e9c']}]}",以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='colorsMode', attr_value='diverging',attr_value不是函数,attr_value加上引号

字符.attr_name='colorsMode', attr_value="'diverging'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'width': 200},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'roc'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'roc'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'roc'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'roc'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'roc'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'roc'}, 'defaultValue': '#1864ab', 'options': [{'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'group': 'RGB', 'options': [{'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'group': 'HEX', 'options': [{'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}],
渲染后:items='fac.AntdText(children = \'颜色\', keyboard = True, style = {\'font-size\': 18}), fac.AntdButton(id = {\'type\': \'open-color-palette\', \'index\': \'roc\'}, children = \'调色板\', type = \'primary\', icon = [fac.AntdIcon(icon = \'md-layers\')]), fac.AntdModal(id = {\'type\': \'custom-color-picker\', \'index\': \'roc\'}, children = [fac.AntdSpace(children = [fuc.FefferyWheelColorPicker(id = {\'type\': \'color-wheel-selector\', \'index\': \'roc\'}), html.Div(id = {\'type\': \'wheel-color-div\', \'index\': \'roc\'}, style = {\'width\': \'200px\', \'height\': \'200px\', \'display\': \'flex\', \'alignItems\': \'center\', \'justifyContent\': \'center\', "borderRadius\'": \'5px\', \'boxShadow\': \'0px 0px 12px rgba(0, 0, 0, .12)\', \'transition\': \'0.25s\', \'backround\': \'#fffc51\'}), fuc.FefferyTwitterColorPicker(id = {\'type\': \'color-twitter-selector\', \'index\': \'roc\'}, colors = [\'#fff4ce\', \'#797673\', \'#fed9cc\', \'#d83b01\', \'#fde7e9\', \'#a80000\', \'#dff6dd\', \'#107c10\'])])], title = \'选择自定义颜色\', renderFooter = True, width = 800), fac.AntdSelect(id = {\'type\': \'custom-color-selector\', \'index\': \'roc\'}, defaultValue = \'#1864ab\', options = [{\'label\' : \'自定义色\', \'value\' : \'#1864ab\', \'colors\' : [\'#1864ab\']}], colorsMode = \'diverging\', disabled = False, style = {\'width\': 200}), fac.AntdSelect(defaultValue = \'配色1\', options = [{\'label\' : \'配色1\', \'value\' : \'配色1\', \'colors\' : [\'#fff5f5\', \'#ff8787\', \'#c92a2a\']}, {\'label\' : \'配色2\', \'value\' : \'配色2\', \'colors\' : [\'#f8f0fc\', \'#da77f2\', \'#862e9c\']}, {\'label\' : \'配色3\', \'value\' : \'配色3\', \'colors\' : [\'#e7f5ff\', \'#4dabf7\', \'#1864ab\']}], colorsMode = \'diverging\', style = {\'width\': 200}), fac.AntdSelect(defaultValue = \'RGB1\', options = [{\'group\' : \'RGB\', \'options\' : [{\'label\' : \'颜色1\', \'value\' : \'RGB1\', \'colors\' : [\'#fff5f5\']}, {\'label\' : \'颜色2\', \'value\' : \'RGB2\', \'colors\' : [\'#ff8787\']}, {\'label\' : \'颜色3\', \'value\' : \'RGB3\', \'colors\' : [\'#c92a2a\']}]}, {\'group\' : \'HEX\', \'options\' : [{\'label\' : \'颜色1\', \'value\' : \'HEX1\', \'colors\' : [\'#f8f0fc\']}, {\'label\' : \'颜色2\', \'value\' : \'HEX2\', \'colors\' : [\'#da77f2\']}, {\'label\' : \'颜色3\', \'value\' : \'HEX3\', \'colors\' : [\'#862e9c\']}]}], colorsMode = \'diverging\', style = {\'width\': 200})',以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '曲线平滑度', 'keyboard': True, 'style': {'font-size': 18, 'marginTop': '10px'}}, {'component': 'fac.AntdCheckbox', 'id': {'type': 'update-plot-params-check', 'index': 'smooth-line'}, 'label': '平滑', 'style': {'marginTop': '10px'}}]},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdSpace',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdSpace'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'fac.AntdText', 'children': '曲线平滑度', 'keyboard': True, 'style': {'font-size': 18, 'marginTop': '10px'}}, {'component': 'fac.AntdCheckbox', 'id': {'type': 'update-plot-params-check', 'index': 'smooth-line'}, 'label': '平滑', 'style': {'marginTop': '10px'}}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdText', 'children': '曲线平滑度', 'keyboard': True, 'style': {'font-size': 18, 'marginTop': '10px'}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdText',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdText'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='children', attr_value='曲线平滑度',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'曲线平滑度'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

整数.attr_name='keyboard', attr_value=True,attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表添加至组件列表

字典.attr_name='style', attr_value={'font-size': 18, 'marginTop': '10px'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdCheckbox', 'id': {'type': 'update-plot-params-check', 'index': 'smooth-line'}, 'label': '平滑', 'style': {'marginTop': '10px'}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdCheckbox',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdCheckbox'",attr_name属于排除对象,不添加至组件列表

字典.attr_name='id', attr_value={'type': 'update-plot-params-check', 'index': 'smooth-line'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='label', attr_value='平滑',attr_value不是函数,attr_value加上引号

字符.attr_name='label', attr_value="'平滑'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'marginTop': '10px'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdText', 'children': '曲线平滑度', 'keyboard': True, 'style': {'font-size': 18, 'marginTop': '10px'}}, {'component': 'fac.AntdCheckbox', 'id': {'type': 'update-plot-params-check', 'index': 'smooth-line'}, 'label': '平滑', 'style': {'marginTop': '10px'}}],
渲染后:items="fac.AntdText(children = '曲线平滑度', keyboard = True, style = {'font-size': 18, 'marginTop': '10px'}), fac.AntdCheckbox(id = {'type': 'update-plot-params-check', 'index': 'smooth-line'}, label = '平滑', style = {'marginTop': '10px'})",以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'id': {'type': 'update-plot-params-value', 'index': 'line-width-roc'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'style': {'marginTop': '10px'}}]},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdSpace',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdSpace'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'id': {'type': 'update-plot-params-value', 'index': 'line-width-roc'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'style': {'marginTop': '10px'}}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdText',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdText'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='children', attr_value='线条样式',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'线条样式'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

整数.attr_name='keyboard', attr_value=True,attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表添加至组件列表

字典.attr_name='style', attr_value={'font-size': 18},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdInputNumber', 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'id': {'type': 'update-plot-params-value', 'index': 'line-width-roc'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'style': {'marginTop': '10px'}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdInputNumber',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdInputNumber'",attr_name属于排除对象,不添加至组件列表

其他.attr_name='min', attr_value=0.5, attr_value是其他类型,不渲染,不添加

其他.attr_name='step', attr_value=0.1, attr_value是其他类型,不渲染,不添加

整数.attr_name='max', attr_value=5,attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表添加至组件列表

整数.attr_name='defaultValue', attr_value=1,attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表添加至组件列表

字典.attr_name='id', attr_value={'type': 'update-plot-params-value', 'index': 'line-width-roc'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='addonBefore', attr_value='线条粗细',attr_value不是函数,attr_value加上引号

字符.attr_name='addonBefore', attr_value="'线条粗细'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表.attr_name='prefix', attr_value=[{'component': 'fac.AntdIcon', 'icon': 'antd-control'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdIcon', 'icon': 'antd-control'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdIcon',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdIcon'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='icon', attr_value='antd-control',attr_value不是函数,attr_value加上引号

字符.attr_name='icon', attr_value="'antd-control'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdIcon', 'icon': 'antd-control'}],
渲染后:items="fac.AntdIcon(icon = 'antd-control')",以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'marginTop': '10px'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'id': {'type': 'update-plot-params-value', 'index': 'line-width-roc'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'style': {'marginTop': '10px'}}],
渲染后:items="fac.AntdText(children = '线条样式', keyboard = True, style = {'font-size': 18}), fac.AntdInputNumber(max = 5, defaultValue = 1, id = {'type': 'update-plot-params-value', 'index': 'line-width-roc'}, addonBefore = '线条粗细', prefix = [fac.AntdIcon(icon = 'antd-control')], style = {'marginTop': '10px'})",以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': 'ROC图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'roc'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'roc'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'roc'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'roc'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'roc'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'roc'}, 'defaultValue': '#1864ab', 'options': [{'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'group': 'RGB', 'options': [{'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'group': 'HEX', 'options': [{'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '曲线平滑度', 'keyboard': True, 'style': {'font-size': 18, 'marginTop': '10px'}}, {'component': 'fac.AntdCheckbox', 'id': {'type': 'update-plot-params-check', 'index': 'smooth-line'}, 'label': '平滑', 'style': {'marginTop': '10px'}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'id': {'type': 'update-plot-params-value', 'index': 'line-width-roc'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'style': {'marginTop': '10px'}}]}],
渲染后:items='html.Div(children = [fac.AntdDivider(children = \'ROC图层参数\', innerTextOrientation = \'left\')], style = {\'width\': 1000}), fac.AntdSpace(children = [fac.AntdText(children = \'颜色\', keyboard = True, style = {\'font-size\': 18}), fac.AntdButton(id = {\'type\': \'open-color-palette\', \'index\': \'roc\'}, children = \'调色板\', type = \'primary\', icon = [fac.AntdIcon(icon = \'md-layers\')]), fac.AntdModal(id = {\'type\': \'custom-color-picker\', \'index\': \'roc\'}, children = [fac.AntdSpace(children = [fuc.FefferyWheelColorPicker(id = {\'type\': \'color-wheel-selector\', \'index\': \'roc\'}), html.Div(id = {\'type\': \'wheel-color-div\', \'index\': \'roc\'}, style = {\'width\': \'200px\', \'height\': \'200px\', \'display\': \'flex\', \'alignItems\': \'center\', \'justifyContent\': \'center\', "borderRadius\'": \'5px\', \'boxShadow\': \'0px 0px 12px rgba(0, 0, 0, .12)\', \'transition\': \'0.25s\', \'backround\': \'#fffc51\'}), fuc.FefferyTwitterColorPicker(id = {\'type\': \'color-twitter-selector\', \'index\': \'roc\'}, colors = [\'#fff4ce\', \'#797673\', \'#fed9cc\', \'#d83b01\', \'#fde7e9\', \'#a80000\', \'#dff6dd\', \'#107c10\'])])], title = \'选择自定义颜色\', renderFooter = True, width = 800), fac.AntdSelect(id = {\'type\': \'custom-color-selector\', \'index\': \'roc\'}, defaultValue = \'#1864ab\', options = [{\'label\' : \'自定义色\', \'value\' : \'#1864ab\', \'colors\' : [\'#1864ab\']}], colorsMode = \'diverging\', disabled = False, style = {\'width\': 200}), fac.AntdSelect(defaultValue = \'配色1\', options = [{\'label\' : \'配色1\', \'value\' : \'配色1\', \'colors\' : [\'#fff5f5\', \'#ff8787\', \'#c92a2a\']}, {\'label\' : \'配色2\', \'value\' : \'配色2\', \'colors\' : [\'#f8f0fc\', \'#da77f2\', \'#862e9c\']}, {\'label\' : \'配色3\', \'value\' : \'配色3\', \'colors\' : [\'#e7f5ff\', \'#4dabf7\', \'#1864ab\']}], colorsMode = \'diverging\', style = {\'width\': 200}), fac.AntdSelect(defaultValue = \'RGB1\', options = [{\'group\' : \'RGB\', \'options\' : [{\'label\' : \'颜色1\', \'value\' : \'RGB1\', \'colors\' : [\'#fff5f5\']}, {\'label\' : \'颜色2\', \'value\' : \'RGB2\', \'colors\' : [\'#ff8787\']}, {\'label\' : \'颜色3\', \'value\' : \'RGB3\', \'colors\' : [\'#c92a2a\']}]}, {\'group\' : \'HEX\', \'options\' : [{\'label\' : \'颜色1\', \'value\' : \'HEX1\', \'colors\' : [\'#f8f0fc\']}, {\'label\' : \'颜色2\', \'value\' : \'HEX2\', \'colors\' : [\'#da77f2\']}, {\'label\' : \'颜色3\', \'value\' : \'HEX3\', \'colors\' : [\'#862e9c\']}]}], colorsMode = \'diverging\', style = {\'width\': 200})]), fac.AntdSpace(children = [fac.AntdText(children = \'曲线平滑度\', keyboard = True, style = {\'font-size\': 18, \'marginTop\': \'10px\'}), fac.AntdCheckbox(id = {\'type\': \'update-plot-params-check\', \'index\': \'smooth-line\'}, label = \'平滑\', style = {\'marginTop\': \'10px\'})]), fac.AntdSpace(children = [fac.AntdText(children = \'线条样式\', keyboard = True, style = {\'font-size\': 18}), fac.AntdInputNumber(max = 5, defaultValue = 1, id = {\'type\': \'update-plot-params-value\', \'index\': \'line-width-roc\'}, addonBefore = \'线条粗细\', prefix = [fac.AntdIcon(icon = \'antd-control\')], style = {\'marginTop\': \'10px\'})])',以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='direction', attr_value='vertical',attr_value不是函数,attr_value加上引号

字符.attr_name='direction', attr_value="'vertical'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdSpace', 'id': 'diagonal-ax-params', 'style': {'display': 'none'}, 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '对角线图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'diagonal'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'diagonal'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'diagonal'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'diagonal'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'diagonal'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'diagonal'}, 'defaultValue': '#1864ab', 'options': [{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'id': {'type': 'update-plot-params-value', 'index': 'line-width-diagonal'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'style': {'marginTop': '10px'}}]}], 'direction': 'vertical'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdSpace',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdSpace'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='id', attr_value='diagonal-ax-params',attr_value不是函数,attr_value加上引号

字符.attr_name='id', attr_value="'diagonal-ax-params'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'display': 'none'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '对角线图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'diagonal'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'diagonal'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'diagonal'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'diagonal'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'diagonal'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'diagonal'}, 'defaultValue': '#1864ab', 'options': [{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'id': {'type': 'update-plot-params-value', 'index': 'line-width-diagonal'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'style': {'marginTop': '10px'}}]}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '对角线图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='html.Div',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'html.Div'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'fac.AntdDivider', 'children': '对角线图层参数', 'innerTextOrientation': 'left'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdDivider', 'children': '对角线图层参数', 'innerTextOrientation': 'left'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdDivider',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdDivider'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='children', attr_value='对角线图层参数',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'对角线图层参数'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='innerTextOrientation', attr_value='left',attr_value不是函数,attr_value加上引号

字符.attr_name='innerTextOrientation', attr_value="'left'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdDivider', 'children': '对角线图层参数', 'innerTextOrientation': 'left'}],
渲染后:items="fac.AntdDivider(children = '对角线图层参数', innerTextOrientation = 'left')",以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'width': 1000},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'diagonal'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'diagonal'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'diagonal'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'diagonal'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'diagonal'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'diagonal'}, 'defaultValue': '#1864ab', 'options': [{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdSpace',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdSpace'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'diagonal'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'diagonal'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'diagonal'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'diagonal'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'diagonal'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'diagonal'}, 'defaultValue': '#1864ab', 'options': [{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdText',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdText'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='children', attr_value='颜色',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'颜色'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

整数.attr_name='keyboard', attr_value=True,attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表添加至组件列表

字典.attr_name='style', attr_value={'font-size': 18},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'diagonal'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdButton',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdButton'",attr_name属于排除对象,不添加至组件列表

字典.attr_name='id', attr_value={'type': 'open-color-palette', 'index': 'diagonal'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='children', attr_value='调色板',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'调色板'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='type', attr_value='primary',attr_value不是函数,attr_value加上引号

字符.attr_name='type', attr_value="'primary'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表.attr_name='icon', attr_value=[{'component': 'fac.AntdIcon', 'icon': 'md-layers'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdIcon', 'icon': 'md-layers'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdIcon',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdIcon'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='icon', attr_value='md-layers',attr_value不是函数,attr_value加上引号

字符.attr_name='icon', attr_value="'md-layers'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdIcon', 'icon': 'md-layers'}],
渲染后:items="fac.AntdIcon(icon = 'md-layers')",以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'diagonal'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'diagonal'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'diagonal'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'diagonal'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdModal',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdModal'",attr_name属于排除对象,不添加至组件列表

字典.attr_name='id', attr_value={'type': 'custom-color-picker', 'index': 'diagonal'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'diagonal'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'diagonal'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'diagonal'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'diagonal'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'diagonal'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'diagonal'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdSpace',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdSpace'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'diagonal'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'diagonal'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'diagonal'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'diagonal'}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fuc.FefferyWheelColorPicker',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fuc.FefferyWheelColorPicker'",attr_name属于排除对象,不添加至组件列表

字典.attr_name='id', attr_value={'type': 'color-wheel-selector', 'index': 'diagonal'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'diagonal'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='html.Div',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'html.Div'",attr_name属于排除对象,不添加至组件列表

字典.attr_name='id', attr_value={'type': 'wheel-color-div', 'index': 'diagonal'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'diagonal'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fuc.FefferyTwitterColorPicker',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fuc.FefferyTwitterColorPicker'",attr_name属于排除对象,不添加至组件列表

字典.attr_name='id', attr_value={'type': 'color-twitter-selector', 'index': 'diagonal'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

列表.attr_name='colors', attr_value=['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10'],attr_value的元素不是字典(以第1个元素判断),以`attr_name=attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'diagonal'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'diagonal'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'diagonal'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}],
渲染后:items='fuc.FefferyWheelColorPicker(id = {\'type\': \'color-wheel-selector\', \'index\': \'diagonal\'}), html.Div(id = {\'type\': \'wheel-color-div\', \'index\': \'diagonal\'}, style = {\'width\': \'200px\', \'height\': \'200px\', \'display\': \'flex\', \'alignItems\': \'center\', \'justifyContent\': \'center\', "borderRadius\'": \'5px\', \'boxShadow\': \'0px 0px 12px rgba(0, 0, 0, .12)\', \'transition\': \'0.25s\', \'backround\': \'#fffc51\'}), fuc.FefferyTwitterColorPicker(id = {\'type\': \'color-twitter-selector\', \'index\': \'diagonal\'}, colors = [\'#fff4ce\', \'#797673\', \'#fed9cc\', \'#d83b01\', \'#fde7e9\', \'#a80000\', \'#dff6dd\', \'#107c10\'])',以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'diagonal'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'diagonal'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'diagonal'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}],
渲染后:items='fac.AntdSpace(children = [fuc.FefferyWheelColorPicker(id = {\'type\': \'color-wheel-selector\', \'index\': \'diagonal\'}), html.Div(id = {\'type\': \'wheel-color-div\', \'index\': \'diagonal\'}, style = {\'width\': \'200px\', \'height\': \'200px\', \'display\': \'flex\', \'alignItems\': \'center\', \'justifyContent\': \'center\', "borderRadius\'": \'5px\', \'boxShadow\': \'0px 0px 12px rgba(0, 0, 0, .12)\', \'transition\': \'0.25s\', \'backround\': \'#fffc51\'}), fuc.FefferyTwitterColorPicker(id = {\'type\': \'color-twitter-selector\', \'index\': \'diagonal\'}, colors = [\'#fff4ce\', \'#797673\', \'#fed9cc\', \'#d83b01\', \'#fde7e9\', \'#a80000\', \'#dff6dd\', \'#107c10\'])])',以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='title', attr_value='选择自定义颜色',attr_value不是函数,attr_value加上引号

字符.attr_name='title', attr_value="'选择自定义颜色'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

整数.attr_name='renderFooter', attr_value=True,attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表添加至组件列表

整数.attr_name='width', attr_value=800,attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'diagonal'}, 'defaultValue': '#1864ab', 'options': [{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdSelect',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdSelect'",attr_name属于排除对象,不添加至组件列表

字典.attr_name='id', attr_value={'type': 'custom-color-selector', 'index': 'diagonal'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='defaultValue', attr_value='#1864ab',attr_value不是函数,attr_value加上引号

字符.attr_name='defaultValue', attr_value="'#1864ab'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表.attr_name='options', attr_value=[{'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='自定义色',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'自定义色'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='#1864ab',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'#1864ab'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'colors'", attr_value=['#1864ab'],attr_value的元素不是字典(以第1个元素判断),以`attr_name=attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}],
渲染后:items="{'label' : '自定义色', 'value' : '#1864ab', 'colors' : ['#1864ab']}",以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='colorsMode', attr_value='diverging',attr_value不是函数,attr_value加上引号

字符.attr_name='colorsMode', attr_value="'diverging'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

整数.attr_name='disabled', attr_value=False,attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表添加至组件列表

字典.attr_name='style', attr_value={'width': 200},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdSelect',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdSelect'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='defaultValue', attr_value='配色1',attr_value不是函数,attr_value加上引号

字符.attr_name='defaultValue', attr_value="'配色1'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表.attr_name='options', attr_value=[{'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='配色1',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'配色1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='配色1',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'配色1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'colors'", attr_value=['#fff5f5', '#ff8787', '#c92a2a'],attr_value的元素不是字典(以第1个元素判断),以`attr_name=attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='配色2',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'配色2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='配色2',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'配色2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'colors'", attr_value=['#f8f0fc', '#da77f2', '#862e9c'],attr_value的元素不是字典(以第1个元素判断),以`attr_name=attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='配色3',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'配色3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='配色3',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'配色3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'colors'", attr_value=['#e7f5ff', '#4dabf7', '#1864ab'],attr_value的元素不是字典(以第1个元素判断),以`attr_name=attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}],
渲染后:items="{'label' : '配色1', 'value' : '配色1', 'colors' : ['#fff5f5', '#ff8787', '#c92a2a']}, {'label' : '配色2', 'value' : '配色2', 'colors' : ['#f8f0fc', '#da77f2', '#862e9c']}, {'label' : '配色3', 'value' : '配色3', 'colors' : ['#e7f5ff', '#4dabf7', '#1864ab']}",以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='colorsMode', attr_value='diverging',attr_value不是函数,attr_value加上引号

字符.attr_name='colorsMode', attr_value="'diverging'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'width': 200},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdSelect',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdSelect'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='defaultValue', attr_value='RGB1',attr_value不是函数,attr_value加上引号

字符.attr_name='defaultValue', attr_value="'RGB1'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表.attr_name='options', attr_value=[{'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'group': 'RGB', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'group'", attr_value='RGB',attr_value不是函数,attr_value加上引号

字符.attr_name="'group'", attr_value="'RGB'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'options'", attr_value=[{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='颜色1',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'颜色1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='RGB1',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'RGB1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'colors'", attr_value=['#fff5f5'],attr_value的元素不是字典(以第1个元素判断),以`attr_name=attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='颜色2',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'颜色2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='RGB2',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'RGB2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'colors'", attr_value=['#ff8787'],attr_value的元素不是字典(以第1个元素判断),以`attr_name=attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='颜色3',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'颜色3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='RGB3',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'RGB3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'colors'", attr_value=['#c92a2a'],attr_value的元素不是字典(以第1个元素判断),以`attr_name=attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}],
渲染后:items="{'label' : '颜色1', 'value' : 'RGB1', 'colors' : ['#fff5f5']}, {'label' : '颜色2', 'value' : 'RGB2', 'colors' : ['#ff8787']}, {'label' : '颜色3', 'value' : 'RGB3', 'colors' : ['#c92a2a']}",以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'group': 'HEX', 'options': [{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'group'", attr_value='HEX',attr_value不是函数,attr_value加上引号

字符.attr_name="'group'", attr_value="'HEX'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'options'", attr_value=[{'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='颜色1',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'颜色1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='HEX1',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'HEX1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'colors'", attr_value=['#f8f0fc'],attr_value的元素不是字典(以第1个元素判断),以`attr_name=attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='颜色2',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'颜色2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='HEX2',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'HEX2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'colors'", attr_value=['#da77f2'],attr_value的元素不是字典(以第1个元素判断),以`attr_name=attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='颜色3',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'颜色3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='HEX3',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'HEX3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'colors'", attr_value=['#862e9c'],attr_value的元素不是字典(以第1个元素判断),以`attr_name=attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}],
渲染后:items="{'label' : '颜色1', 'value' : 'HEX1', 'colors' : ['#f8f0fc']}, {'label' : '颜色2', 'value' : 'HEX2', 'colors' : ['#da77f2']}, {'label' : '颜色3', 'value' : 'HEX3', 'colors' : ['#862e9c']}",以`attr_name : attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'group': 'RGB', 'options': [{'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'group': 'HEX', 'options': [{'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}],
渲染后:items="{'group' : 'RGB', 'options' : [{'label' : '颜色1', 'value' : 'RGB1', 'colors' : ['#fff5f5']}, {'label' : '颜色2', 'value' : 'RGB2', 'colors' : ['#ff8787']}, {'label' : '颜色3', 'value' : 'RGB3', 'colors' : ['#c92a2a']}]}, {'group' : 'HEX', 'options' : [{'label' : '颜色1', 'value' : 'HEX1', 'colors' : ['#f8f0fc']}, {'label' : '颜色2', 'value' : 'HEX2', 'colors' : ['#da77f2']}, {'label' : '颜色3', 'value' : 'HEX3', 'colors' : ['#862e9c']}]}",以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='colorsMode', attr_value='diverging',attr_value不是函数,attr_value加上引号

字符.attr_name='colorsMode', attr_value="'diverging'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'width': 200},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'diagonal'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'diagonal'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'diagonal'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'diagonal'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'diagonal'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'diagonal'}, 'defaultValue': '#1864ab', 'options': [{'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'group': 'RGB', 'options': [{'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'group': 'HEX', 'options': [{'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}],
渲染后:items='fac.AntdText(children = \'颜色\', keyboard = True, style = {\'font-size\': 18}), fac.AntdButton(id = {\'type\': \'open-color-palette\', \'index\': \'diagonal\'}, children = \'调色板\', type = \'primary\', icon = [fac.AntdIcon(icon = \'md-layers\')]), fac.AntdModal(id = {\'type\': \'custom-color-picker\', \'index\': \'diagonal\'}, children = [fac.AntdSpace(children = [fuc.FefferyWheelColorPicker(id = {\'type\': \'color-wheel-selector\', \'index\': \'diagonal\'}), html.Div(id = {\'type\': \'wheel-color-div\', \'index\': \'diagonal\'}, style = {\'width\': \'200px\', \'height\': \'200px\', \'display\': \'flex\', \'alignItems\': \'center\', \'justifyContent\': \'center\', "borderRadius\'": \'5px\', \'boxShadow\': \'0px 0px 12px rgba(0, 0, 0, .12)\', \'transition\': \'0.25s\', \'backround\': \'#fffc51\'}), fuc.FefferyTwitterColorPicker(id = {\'type\': \'color-twitter-selector\', \'index\': \'diagonal\'}, colors = [\'#fff4ce\', \'#797673\', \'#fed9cc\', \'#d83b01\', \'#fde7e9\', \'#a80000\', \'#dff6dd\', \'#107c10\'])])], title = \'选择自定义颜色\', renderFooter = True, width = 800), fac.AntdSelect(id = {\'type\': \'custom-color-selector\', \'index\': \'diagonal\'}, defaultValue = \'#1864ab\', options = [{\'label\' : \'自定义色\', \'value\' : \'#1864ab\', \'colors\' : [\'#1864ab\']}], colorsMode = \'diverging\', disabled = False, style = {\'width\': 200}), fac.AntdSelect(defaultValue = \'配色1\', options = [{\'label\' : \'配色1\', \'value\' : \'配色1\', \'colors\' : [\'#fff5f5\', \'#ff8787\', \'#c92a2a\']}, {\'label\' : \'配色2\', \'value\' : \'配色2\', \'colors\' : [\'#f8f0fc\', \'#da77f2\', \'#862e9c\']}, {\'label\' : \'配色3\', \'value\' : \'配色3\', \'colors\' : [\'#e7f5ff\', \'#4dabf7\', \'#1864ab\']}], colorsMode = \'diverging\', style = {\'width\': 200}), fac.AntdSelect(defaultValue = \'RGB1\', options = [{\'group\' : \'RGB\', \'options\' : [{\'label\' : \'颜色1\', \'value\' : \'RGB1\', \'colors\' : [\'#fff5f5\']}, {\'label\' : \'颜色2\', \'value\' : \'RGB2\', \'colors\' : [\'#ff8787\']}, {\'label\' : \'颜色3\', \'value\' : \'RGB3\', \'colors\' : [\'#c92a2a\']}]}, {\'group\' : \'HEX\', \'options\' : [{\'label\' : \'颜色1\', \'value\' : \'HEX1\', \'colors\' : [\'#f8f0fc\']}, {\'label\' : \'颜色2\', \'value\' : \'HEX2\', \'colors\' : [\'#da77f2\']}, {\'label\' : \'颜色3\', \'value\' : \'HEX3\', \'colors\' : [\'#862e9c\']}]}], colorsMode = \'diverging\', style = {\'width\': 200})',以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'id': {'type': 'update-plot-params-value', 'index': 'line-width-diagonal'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'style': {'marginTop': '10px'}}]},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdSpace',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdSpace'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'id': {'type': 'update-plot-params-value', 'index': 'line-width-diagonal'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'style': {'marginTop': '10px'}}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdText',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdText'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='children', attr_value='线条样式',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'线条样式'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

整数.attr_name='keyboard', attr_value=True,attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表添加至组件列表

字典.attr_name='style', attr_value={'font-size': 18},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdInputNumber', 'id': {'type': 'update-plot-params-value', 'index': 'line-width-diagonal'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'style': {'marginTop': '10px'}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdInputNumber',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdInputNumber'",attr_name属于排除对象,不添加至组件列表

字典.attr_name='id', attr_value={'type': 'update-plot-params-value', 'index': 'line-width-diagonal'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='addonBefore', attr_value='线条粗细',attr_value不是函数,attr_value加上引号

字符.attr_name='addonBefore', attr_value="'线条粗细'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表.attr_name='prefix', attr_value=[{'component': 'fac.AntdIcon', 'icon': 'antd-control'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdIcon', 'icon': 'antd-control'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdIcon',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdIcon'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='icon', attr_value='antd-control',attr_value不是函数,attr_value加上引号

字符.attr_name='icon', attr_value="'antd-control'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdIcon', 'icon': 'antd-control'}],
渲染后:items="fac.AntdIcon(icon = 'antd-control')",以`attr_name = attr_value`形式添加至组件列表

其他.attr_name='min', attr_value=0.5, attr_value是其他类型,不渲染,不添加

其他.attr_name='step', attr_value=0.1, attr_value是其他类型,不渲染,不添加

整数.attr_name='max', attr_value=5,attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表添加至组件列表

整数.attr_name='defaultValue', attr_value=1,attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表添加至组件列表

字典.attr_name='style', attr_value={'marginTop': '10px'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'id': {'type': 'update-plot-params-value', 'index': 'line-width-diagonal'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'style': {'marginTop': '10px'}}],
渲染后:items="fac.AntdText(children = '线条样式', keyboard = True, style = {'font-size': 18}), fac.AntdInputNumber(id = {'type': 'update-plot-params-value', 'index': 'line-width-diagonal'}, addonBefore = '线条粗细', prefix = [fac.AntdIcon(icon = 'antd-control')], max = 5, defaultValue = 1, style = {'marginTop': '10px'})",以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '对角线图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'diagonal'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'diagonal'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'diagonal'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'diagonal'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'diagonal'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'diagonal'}, 'defaultValue': '#1864ab', 'options': [{'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'group': 'RGB', 'options': [{'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'group': 'HEX', 'options': [{'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'id': {'type': 'update-plot-params-value', 'index': 'line-width-diagonal'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'style': {'marginTop': '10px'}}]}],
渲染后:items='html.Div(children = [fac.AntdDivider(children = \'对角线图层参数\', innerTextOrientation = \'left\')], style = {\'width\': 1000}), fac.AntdSpace(children = [fac.AntdText(children = \'颜色\', keyboard = True, style = {\'font-size\': 18}), fac.AntdButton(id = {\'type\': \'open-color-palette\', \'index\': \'diagonal\'}, children = \'调色板\', type = \'primary\', icon = [fac.AntdIcon(icon = \'md-layers\')]), fac.AntdModal(id = {\'type\': \'custom-color-picker\', \'index\': \'diagonal\'}, children = [fac.AntdSpace(children = [fuc.FefferyWheelColorPicker(id = {\'type\': \'color-wheel-selector\', \'index\': \'diagonal\'}), html.Div(id = {\'type\': \'wheel-color-div\', \'index\': \'diagonal\'}, style = {\'width\': \'200px\', \'height\': \'200px\', \'display\': \'flex\', \'alignItems\': \'center\', \'justifyContent\': \'center\', "borderRadius\'": \'5px\', \'boxShadow\': \'0px 0px 12px rgba(0, 0, 0, .12)\', \'transition\': \'0.25s\', \'backround\': \'#fffc51\'}), fuc.FefferyTwitterColorPicker(id = {\'type\': \'color-twitter-selector\', \'index\': \'diagonal\'}, colors = [\'#fff4ce\', \'#797673\', \'#fed9cc\', \'#d83b01\', \'#fde7e9\', \'#a80000\', \'#dff6dd\', \'#107c10\'])])], title = \'选择自定义颜色\', renderFooter = True, width = 800), fac.AntdSelect(id = {\'type\': \'custom-color-selector\', \'index\': \'diagonal\'}, defaultValue = \'#1864ab\', options = [{\'label\' : \'自定义色\', \'value\' : \'#1864ab\', \'colors\' : [\'#1864ab\']}], colorsMode = \'diverging\', disabled = False, style = {\'width\': 200}), fac.AntdSelect(defaultValue = \'配色1\', options = [{\'label\' : \'配色1\', \'value\' : \'配色1\', \'colors\' : [\'#fff5f5\', \'#ff8787\', \'#c92a2a\']}, {\'label\' : \'配色2\', \'value\' : \'配色2\', \'colors\' : [\'#f8f0fc\', \'#da77f2\', \'#862e9c\']}, {\'label\' : \'配色3\', \'value\' : \'配色3\', \'colors\' : [\'#e7f5ff\', \'#4dabf7\', \'#1864ab\']}], colorsMode = \'diverging\', style = {\'width\': 200}), fac.AntdSelect(defaultValue = \'RGB1\', options = [{\'group\' : \'RGB\', \'options\' : [{\'label\' : \'颜色1\', \'value\' : \'RGB1\', \'colors\' : [\'#fff5f5\']}, {\'label\' : \'颜色2\', \'value\' : \'RGB2\', \'colors\' : [\'#ff8787\']}, {\'label\' : \'颜色3\', \'value\' : \'RGB3\', \'colors\' : [\'#c92a2a\']}]}, {\'group\' : \'HEX\', \'options\' : [{\'label\' : \'颜色1\', \'value\' : \'HEX1\', \'colors\' : [\'#f8f0fc\']}, {\'label\' : \'颜色2\', \'value\' : \'HEX2\', \'colors\' : [\'#da77f2\']}, {\'label\' : \'颜色3\', \'value\' : \'HEX3\', \'colors\' : [\'#862e9c\']}]}], colorsMode = \'diverging\', style = {\'width\': 200})]), fac.AntdSpace(children = [fac.AntdText(children = \'线条样式\', keyboard = True, style = {\'font-size\': 18}), fac.AntdInputNumber(id = {\'type\': \'update-plot-params-value\', \'index\': \'line-width-diagonal\'}, addonBefore = \'线条粗细\', prefix = [fac.AntdIcon(icon = \'antd-control\')], max = 5, defaultValue = 1, style = {\'marginTop\': \'10px\'})])',以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='direction', attr_value='vertical',attr_value不是函数,attr_value加上引号

字符.attr_name='direction', attr_value="'vertical'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '图片格式', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'id': {'type': 'update-plot-params-value', 'index': 'theme-style'}, 'options': "f(generate_attr_dict_from_str_list, str_list = plt.style.available, dict_keys = ['label', 'value'])", 'placeholder': '选择主题', 'style': {'width': 300}}], 'direction': 'vertical'}, {'component': 'fac.AntdSpace', 'id': 'roc-ax-params', 'style': {'display': 'none'}, 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': 'ROC图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'roc'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'roc'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'roc'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'roc'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'roc'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'roc'}, 'defaultValue': '#1864ab', 'options': [{'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'group': 'RGB', 'options': [{'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'group': 'HEX', 'options': [{'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '曲线平滑度', 'keyboard': True, 'style': {'font-size': 18, 'marginTop': '10px'}}, {'component': 'fac.AntdCheckbox', 'id': {'type': 'update-plot-params-check', 'index': 'smooth-line'}, 'label': '平滑', 'style': {'marginTop': '10px'}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'id': {'type': 'update-plot-params-value', 'index': 'line-width-roc'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'style': {'marginTop': '10px'}}]}], 'direction': 'vertical'}, {'component': 'fac.AntdSpace', 'id': 'diagonal-ax-params', 'style': {'display': 'none'}, 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '对角线图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'diagonal'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'diagonal'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'diagonal'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'diagonal'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'diagonal'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'diagonal'}, 'defaultValue': '#1864ab', 'options': [{'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'group': 'RGB', 'options': [{'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'group': 'HEX', 'options': [{'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'id': {'type': 'update-plot-params-value', 'index': 'line-width-diagonal'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'style': {'marginTop': '10px'}}]}], 'direction': 'vertical'}],
渲染后:items='fac.AntdSpace(children = [html.Div(children = [fac.AntdDivider(children = \'图片格式\', innerTextOrientation = \'left\')], style = {\'width\': 1000}), fac.AntdSelect(id = {\'type\': \'update-plot-params-value\', \'index\': \'theme-style\'}, options = generate_attr_dict_from_str_list( str_list = plt.style.available, dict_keys = [\'label\', \'value\']), placeholder = \'选择主题\', style = {\'width\': 300})], direction = \'vertical\'), fac.AntdSpace(id = \'roc-ax-params\', style = {\'display\': \'none\'}, children = [html.Div(children = [fac.AntdDivider(children = \'ROC图层参数\', innerTextOrientation = \'left\')], style = {\'width\': 1000}), fac.AntdSpace(children = [fac.AntdText(children = \'颜色\', keyboard = True, style = {\'font-size\': 18}), fac.AntdButton(id = {\'type\': \'open-color-palette\', \'index\': \'roc\'}, children = \'调色板\', type = \'primary\', icon = [fac.AntdIcon(icon = \'md-layers\')]), fac.AntdModal(id = {\'type\': \'custom-color-picker\', \'index\': \'roc\'}, children = [fac.AntdSpace(children = [fuc.FefferyWheelColorPicker(id = {\'type\': \'color-wheel-selector\', \'index\': \'roc\'}), html.Div(id = {\'type\': \'wheel-color-div\', \'index\': \'roc\'}, style = {\'width\': \'200px\', \'height\': \'200px\', \'display\': \'flex\', \'alignItems\': \'center\', \'justifyContent\': \'center\', "borderRadius\'": \'5px\', \'boxShadow\': \'0px 0px 12px rgba(0, 0, 0, .12)\', \'transition\': \'0.25s\', \'backround\': \'#fffc51\'}), fuc.FefferyTwitterColorPicker(id = {\'type\': \'color-twitter-selector\', \'index\': \'roc\'}, colors = [\'#fff4ce\', \'#797673\', \'#fed9cc\', \'#d83b01\', \'#fde7e9\', \'#a80000\', \'#dff6dd\', \'#107c10\'])])], title = \'选择自定义颜色\', renderFooter = True, width = 800), fac.AntdSelect(id = {\'type\': \'custom-color-selector\', \'index\': \'roc\'}, defaultValue = \'#1864ab\', options = [{\'label\' : \'自定义色\', \'value\' : \'#1864ab\', \'colors\' : [\'#1864ab\']}], colorsMode = \'diverging\', disabled = False, style = {\'width\': 200}), fac.AntdSelect(defaultValue = \'配色1\', options = [{\'label\' : \'配色1\', \'value\' : \'配色1\', \'colors\' : [\'#fff5f5\', \'#ff8787\', \'#c92a2a\']}, {\'label\' : \'配色2\', \'value\' : \'配色2\', \'colors\' : [\'#f8f0fc\', \'#da77f2\', \'#862e9c\']}, {\'label\' : \'配色3\', \'value\' : \'配色3\', \'colors\' : [\'#e7f5ff\', \'#4dabf7\', \'#1864ab\']}], colorsMode = \'diverging\', style = {\'width\': 200}), fac.AntdSelect(defaultValue = \'RGB1\', options = [{\'group\' : \'RGB\', \'options\' : [{\'label\' : \'颜色1\', \'value\' : \'RGB1\', \'colors\' : [\'#fff5f5\']}, {\'label\' : \'颜色2\', \'value\' : \'RGB2\', \'colors\' : [\'#ff8787\']}, {\'label\' : \'颜色3\', \'value\' : \'RGB3\', \'colors\' : [\'#c92a2a\']}]}, {\'group\' : \'HEX\', \'options\' : [{\'label\' : \'颜色1\', \'value\' : \'HEX1\', \'colors\' : [\'#f8f0fc\']}, {\'label\' : \'颜色2\', \'value\' : \'HEX2\', \'colors\' : [\'#da77f2\']}, {\'label\' : \'颜色3\', \'value\' : \'HEX3\', \'colors\' : [\'#862e9c\']}]}], colorsMode = \'diverging\', style = {\'width\': 200})]), fac.AntdSpace(children = [fac.AntdText(children = \'曲线平滑度\', keyboard = True, style = {\'font-size\': 18, \'marginTop\': \'10px\'}), fac.AntdCheckbox(id = {\'type\': \'update-plot-params-check\', \'index\': \'smooth-line\'}, label = \'平滑\', style = {\'marginTop\': \'10px\'})]), fac.AntdSpace(children = [fac.AntdText(children = \'线条样式\', keyboard = True, style = {\'font-size\': 18}), fac.AntdInputNumber(max = 5, defaultValue = 1, id = {\'type\': \'update-plot-params-value\', \'index\': \'line-width-roc\'}, addonBefore = \'线条粗细\', prefix = [fac.AntdIcon(icon = \'antd-control\')], style = {\'marginTop\': \'10px\'})])], direction = \'vertical\'), fac.AntdSpace(id = \'diagonal-ax-params\', style = {\'display\': \'none\'}, children = [html.Div(children = [fac.AntdDivider(children = \'对角线图层参数\', innerTextOrientation = \'left\')], style = {\'width\': 1000}), fac.AntdSpace(children = [fac.AntdText(children = \'颜色\', keyboard = True, style = {\'font-size\': 18}), fac.AntdButton(id = {\'type\': \'open-color-palette\', \'index\': \'diagonal\'}, children = \'调色板\', type = \'primary\', icon = [fac.AntdIcon(icon = \'md-layers\')]), fac.AntdModal(id = {\'type\': \'custom-color-picker\', \'index\': \'diagonal\'}, children = [fac.AntdSpace(children = [fuc.FefferyWheelColorPicker(id = {\'type\': \'color-wheel-selector\', \'index\': \'diagonal\'}), html.Div(id = {\'type\': \'wheel-color-div\', \'index\': \'diagonal\'}, style = {\'width\': \'200px\', \'height\': \'200px\', \'display\': \'flex\', \'alignItems\': \'center\', \'justifyContent\': \'center\', "borderRadius\'": \'5px\', \'boxShadow\': \'0px 0px 12px rgba(0, 0, 0, .12)\', \'transition\': \'0.25s\', \'backround\': \'#fffc51\'}), fuc.FefferyTwitterColorPicker(id = {\'type\': \'color-twitter-selector\', \'index\': \'diagonal\'}, colors = [\'#fff4ce\', \'#797673\', \'#fed9cc\', \'#d83b01\', \'#fde7e9\', \'#a80000\', \'#dff6dd\', \'#107c10\'])])], title = \'选择自定义颜色\', renderFooter = True, width = 800), fac.AntdSelect(id = {\'type\': \'custom-color-selector\', \'index\': \'diagonal\'}, defaultValue = \'#1864ab\', options = [{\'label\' : \'自定义色\', \'value\' : \'#1864ab\', \'colors\' : [\'#1864ab\']}], colorsMode = \'diverging\', disabled = False, style = {\'width\': 200}), fac.AntdSelect(defaultValue = \'配色1\', options = [{\'label\' : \'配色1\', \'value\' : \'配色1\', \'colors\' : [\'#fff5f5\', \'#ff8787\', \'#c92a2a\']}, {\'label\' : \'配色2\', \'value\' : \'配色2\', \'colors\' : [\'#f8f0fc\', \'#da77f2\', \'#862e9c\']}, {\'label\' : \'配色3\', \'value\' : \'配色3\', \'colors\' : [\'#e7f5ff\', \'#4dabf7\', \'#1864ab\']}], colorsMode = \'diverging\', style = {\'width\': 200}), fac.AntdSelect(defaultValue = \'RGB1\', options = [{\'group\' : \'RGB\', \'options\' : [{\'label\' : \'颜色1\', \'value\' : \'RGB1\', \'colors\' : [\'#fff5f5\']}, {\'label\' : \'颜色2\', \'value\' : \'RGB2\', \'colors\' : [\'#ff8787\']}, {\'label\' : \'颜色3\', \'value\' : \'RGB3\', \'colors\' : [\'#c92a2a\']}]}, {\'group\' : \'HEX\', \'options\' : [{\'label\' : \'颜色1\', \'value\' : \'HEX1\', \'colors\' : [\'#f8f0fc\']}, {\'label\' : \'颜色2\', \'value\' : \'HEX2\', \'colors\' : [\'#da77f2\']}, {\'label\' : \'颜色3\', \'value\' : \'HEX3\', \'colors\' : [\'#862e9c\']}]}], colorsMode = \'diverging\', style = {\'width\': 200})]), fac.AntdSpace(children = [fac.AntdText(children = \'线条样式\', keyboard = True, style = {\'font-size\': 18}), fac.AntdInputNumber(id = {\'type\': \'update-plot-params-value\', \'index\': \'line-width-diagonal\'}, addonBefore = \'线条粗细\', prefix = [fac.AntdIcon(icon = \'antd-control\')], max = 5, defaultValue = 1, style = {\'marginTop\': \'10px\'})])], direction = \'vertical\')',以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='direction', attr_value='vertical',attr_value不是函数,attr_value加上引号

字符.attr_name='direction', attr_value="'vertical'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdDivider', 'children': '图层参数'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '图片格式', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'id': {'type': 'update-plot-params-value', 'index': 'theme-style'}, 'options': "f(generate_attr_dict_from_str_list, str_list = plt.style.available, dict_keys = ['label', 'value'])", 'placeholder': '选择主题', 'style': {'width': 300}}], 'direction': 'vertical'}, {'component': 'fac.AntdSpace', 'id': 'roc-ax-params', 'style': {'display': 'none'}, 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': 'ROC图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'roc'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'roc'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'roc'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'roc'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'roc'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'roc'}, 'defaultValue': '#1864ab', 'options': [{'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'group': 'RGB', 'options': [{'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'group': 'HEX', 'options': [{'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '曲线平滑度', 'keyboard': True, 'style': {'font-size': 18, 'marginTop': '10px'}}, {'component': 'fac.AntdCheckbox', 'id': {'type': 'update-plot-params-check', 'index': 'smooth-line'}, 'label': '平滑', 'style': {'marginTop': '10px'}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'id': {'type': 'update-plot-params-value', 'index': 'line-width-roc'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'style': {'marginTop': '10px'}}]}], 'direction': 'vertical'}, {'component': 'fac.AntdSpace', 'id': 'diagonal-ax-params', 'style': {'display': 'none'}, 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '对角线图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'diagonal'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'diagonal'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'diagonal'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'diagonal'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'diagonal'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'diagonal'}, 'defaultValue': '#1864ab', 'options': [{'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'group': 'RGB', 'options': [{'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'group': 'HEX', 'options': [{'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'id': {'type': 'update-plot-params-value', 'index': 'line-width-diagonal'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'style': {'marginTop': '10px'}}]}], 'direction': 'vertical'}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center'}}],
渲染后:items='fac.AntdDivider(children = \'图层参数\'), fac.AntdSpace(children = [fac.AntdSpace(children = [html.Div(children = [fac.AntdDivider(children = \'图片格式\', innerTextOrientation = \'left\')], style = {\'width\': 1000}), fac.AntdSelect(id = {\'type\': \'update-plot-params-value\', \'index\': \'theme-style\'}, options = generate_attr_dict_from_str_list( str_list = plt.style.available, dict_keys = [\'label\', \'value\']), placeholder = \'选择主题\', style = {\'width\': 300})], direction = \'vertical\'), fac.AntdSpace(id = \'roc-ax-params\', style = {\'display\': \'none\'}, children = [html.Div(children = [fac.AntdDivider(children = \'ROC图层参数\', innerTextOrientation = \'left\')], style = {\'width\': 1000}), fac.AntdSpace(children = [fac.AntdText(children = \'颜色\', keyboard = True, style = {\'font-size\': 18}), fac.AntdButton(id = {\'type\': \'open-color-palette\', \'index\': \'roc\'}, children = \'调色板\', type = \'primary\', icon = [fac.AntdIcon(icon = \'md-layers\')]), fac.AntdModal(id = {\'type\': \'custom-color-picker\', \'index\': \'roc\'}, children = [fac.AntdSpace(children = [fuc.FefferyWheelColorPicker(id = {\'type\': \'color-wheel-selector\', \'index\': \'roc\'}), html.Div(id = {\'type\': \'wheel-color-div\', \'index\': \'roc\'}, style = {\'width\': \'200px\', \'height\': \'200px\', \'display\': \'flex\', \'alignItems\': \'center\', \'justifyContent\': \'center\', "borderRadius\'": \'5px\', \'boxShadow\': \'0px 0px 12px rgba(0, 0, 0, .12)\', \'transition\': \'0.25s\', \'backround\': \'#fffc51\'}), fuc.FefferyTwitterColorPicker(id = {\'type\': \'color-twitter-selector\', \'index\': \'roc\'}, colors = [\'#fff4ce\', \'#797673\', \'#fed9cc\', \'#d83b01\', \'#fde7e9\', \'#a80000\', \'#dff6dd\', \'#107c10\'])])], title = \'选择自定义颜色\', renderFooter = True, width = 800), fac.AntdSelect(id = {\'type\': \'custom-color-selector\', \'index\': \'roc\'}, defaultValue = \'#1864ab\', options = [{\'label\' : \'自定义色\', \'value\' : \'#1864ab\', \'colors\' : [\'#1864ab\']}], colorsMode = \'diverging\', disabled = False, style = {\'width\': 200}), fac.AntdSelect(defaultValue = \'配色1\', options = [{\'label\' : \'配色1\', \'value\' : \'配色1\', \'colors\' : [\'#fff5f5\', \'#ff8787\', \'#c92a2a\']}, {\'label\' : \'配色2\', \'value\' : \'配色2\', \'colors\' : [\'#f8f0fc\', \'#da77f2\', \'#862e9c\']}, {\'label\' : \'配色3\', \'value\' : \'配色3\', \'colors\' : [\'#e7f5ff\', \'#4dabf7\', \'#1864ab\']}], colorsMode = \'diverging\', style = {\'width\': 200}), fac.AntdSelect(defaultValue = \'RGB1\', options = [{\'group\' : \'RGB\', \'options\' : [{\'label\' : \'颜色1\', \'value\' : \'RGB1\', \'colors\' : [\'#fff5f5\']}, {\'label\' : \'颜色2\', \'value\' : \'RGB2\', \'colors\' : [\'#ff8787\']}, {\'label\' : \'颜色3\', \'value\' : \'RGB3\', \'colors\' : [\'#c92a2a\']}]}, {\'group\' : \'HEX\', \'options\' : [{\'label\' : \'颜色1\', \'value\' : \'HEX1\', \'colors\' : [\'#f8f0fc\']}, {\'label\' : \'颜色2\', \'value\' : \'HEX2\', \'colors\' : [\'#da77f2\']}, {\'label\' : \'颜色3\', \'value\' : \'HEX3\', \'colors\' : [\'#862e9c\']}]}], colorsMode = \'diverging\', style = {\'width\': 200})]), fac.AntdSpace(children = [fac.AntdText(children = \'曲线平滑度\', keyboard = True, style = {\'font-size\': 18, \'marginTop\': \'10px\'}), fac.AntdCheckbox(id = {\'type\': \'update-plot-params-check\', \'index\': \'smooth-line\'}, label = \'平滑\', style = {\'marginTop\': \'10px\'})]), fac.AntdSpace(children = [fac.AntdText(children = \'线条样式\', keyboard = True, style = {\'font-size\': 18}), fac.AntdInputNumber(max = 5, defaultValue = 1, id = {\'type\': \'update-plot-params-value\', \'index\': \'line-width-roc\'}, addonBefore = \'线条粗细\', prefix = [fac.AntdIcon(icon = \'antd-control\')], style = {\'marginTop\': \'10px\'})])], direction = \'vertical\'), fac.AntdSpace(id = \'diagonal-ax-params\', style = {\'display\': \'none\'}, children = [html.Div(children = [fac.AntdDivider(children = \'对角线图层参数\', innerTextOrientation = \'left\')], style = {\'width\': 1000}), fac.AntdSpace(children = [fac.AntdText(children = \'颜色\', keyboard = True, style = {\'font-size\': 18}), fac.AntdButton(id = {\'type\': \'open-color-palette\', \'index\': \'diagonal\'}, children = \'调色板\', type = \'primary\', icon = [fac.AntdIcon(icon = \'md-layers\')]), fac.AntdModal(id = {\'type\': \'custom-color-picker\', \'index\': \'diagonal\'}, children = [fac.AntdSpace(children = [fuc.FefferyWheelColorPicker(id = {\'type\': \'color-wheel-selector\', \'index\': \'diagonal\'}), html.Div(id = {\'type\': \'wheel-color-div\', \'index\': \'diagonal\'}, style = {\'width\': \'200px\', \'height\': \'200px\', \'display\': \'flex\', \'alignItems\': \'center\', \'justifyContent\': \'center\', "borderRadius\'": \'5px\', \'boxShadow\': \'0px 0px 12px rgba(0, 0, 0, .12)\', \'transition\': \'0.25s\', \'backround\': \'#fffc51\'}), fuc.FefferyTwitterColorPicker(id = {\'type\': \'color-twitter-selector\', \'index\': \'diagonal\'}, colors = [\'#fff4ce\', \'#797673\', \'#fed9cc\', \'#d83b01\', \'#fde7e9\', \'#a80000\', \'#dff6dd\', \'#107c10\'])])], title = \'选择自定义颜色\', renderFooter = True, width = 800), fac.AntdSelect(id = {\'type\': \'custom-color-selector\', \'index\': \'diagonal\'}, defaultValue = \'#1864ab\', options = [{\'label\' : \'自定义色\', \'value\' : \'#1864ab\', \'colors\' : [\'#1864ab\']}], colorsMode = \'diverging\', disabled = False, style = {\'width\': 200}), fac.AntdSelect(defaultValue = \'配色1\', options = [{\'label\' : \'配色1\', \'value\' : \'配色1\', \'colors\' : [\'#fff5f5\', \'#ff8787\', \'#c92a2a\']}, {\'label\' : \'配色2\', \'value\' : \'配色2\', \'colors\' : [\'#f8f0fc\', \'#da77f2\', \'#862e9c\']}, {\'label\' : \'配色3\', \'value\' : \'配色3\', \'colors\' : [\'#e7f5ff\', \'#4dabf7\', \'#1864ab\']}], colorsMode = \'diverging\', style = {\'width\': 200}), fac.AntdSelect(defaultValue = \'RGB1\', options = [{\'group\' : \'RGB\', \'options\' : [{\'label\' : \'颜色1\', \'value\' : \'RGB1\', \'colors\' : [\'#fff5f5\']}, {\'label\' : \'颜色2\', \'value\' : \'RGB2\', \'colors\' : [\'#ff8787\']}, {\'label\' : \'颜色3\', \'value\' : \'RGB3\', \'colors\' : [\'#c92a2a\']}]}, {\'group\' : \'HEX\', \'options\' : [{\'label\' : \'颜色1\', \'value\' : \'HEX1\', \'colors\' : [\'#f8f0fc\']}, {\'label\' : \'颜色2\', \'value\' : \'HEX2\', \'colors\' : [\'#da77f2\']}, {\'label\' : \'颜色3\', \'value\' : \'HEX3\', \'colors\' : [\'#862e9c\']}]}], colorsMode = \'diverging\', style = {\'width\': 200})]), fac.AntdSpace(children = [fac.AntdText(children = \'线条样式\', keyboard = True, style = {\'font-size\': 18}), fac.AntdInputNumber(id = {\'type\': \'update-plot-params-value\', \'index\': \'line-width-diagonal\'}, addonBefore = \'线条粗细\', prefix = [fac.AntdIcon(icon = \'antd-control\')], max = 5, defaultValue = 1, style = {\'marginTop\': \'10px\'})])], direction = \'vertical\')], direction = \'vertical\', style = {\'display\': \'flex\', \'justifyContent\': \'left\', \'alignItems\': \'center\'})',以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'title': '步骤5', 'subTitle': '作图', 'description': [{'component': 'fac.AntdDivider', 'children': '作图'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择图片布局', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdCheckCardGroup', 'children': [{'component': 'fac.AntdCheckCard', 'children': '1行1列', 'value': '1r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '1行2列', 'value': '1r2c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行1列', 'value': '2r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行2列', 'value': '2r2c', 'size': 'small'}], 'defaultValue': '1r1c'}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择图层', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdCascader', 'id': 'plot-axes-cascader', 'placeholder': '选择图层对象', 'options': [{'keep-dict-unrendered': True, 'label': '图片-1', 'value': '图片-1', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-2', 'value': '图片-2', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-3', 'value': '图片-3', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-4', 'value': '图片-4', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}], 'multiple': True}, {'component': 'fac.AntdButton', 'id': 'generate-plot', 'children': '生成图片', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}], 'style': {'marginTop': '100px'}}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center', 'height': 400}}]},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'title'", attr_value='步骤5',attr_value不是函数,attr_value加上引号

字符.attr_name="'title'", attr_value="'步骤5'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'subTitle'", attr_value='作图',attr_value不是函数,attr_value加上引号

字符.attr_name="'subTitle'", attr_value="'作图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'description'", attr_value=[{'component': 'fac.AntdDivider', 'children': '作图'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择图片布局', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdCheckCardGroup', 'children': [{'component': 'fac.AntdCheckCard', 'children': '1行1列', 'value': '1r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '1行2列', 'value': '1r2c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行1列', 'value': '2r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行2列', 'value': '2r2c', 'size': 'small'}], 'defaultValue': '1r1c'}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择图层', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdCascader', 'id': 'plot-axes-cascader', 'placeholder': '选择图层对象', 'options': [{'keep-dict-unrendered': True, 'label': '图片-1', 'value': '图片-1', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-2', 'value': '图片-2', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-3', 'value': '图片-3', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-4', 'value': '图片-4', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}], 'multiple': True}, {'component': 'fac.AntdButton', 'id': 'generate-plot', 'children': '生成图片', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}], 'style': {'marginTop': '100px'}}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center', 'height': 400}}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdDivider', 'children': '作图'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdDivider',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdDivider'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='children', attr_value='作图',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'作图'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择图片布局', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdCheckCardGroup', 'children': [{'component': 'fac.AntdCheckCard', 'children': '1行1列', 'value': '1r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '1行2列', 'value': '1r2c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行1列', 'value': '2r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行2列', 'value': '2r2c', 'size': 'small'}], 'defaultValue': '1r1c'}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择图层', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdCascader', 'id': 'plot-axes-cascader', 'placeholder': '选择图层对象', 'options': [{'keep-dict-unrendered': True, 'label': '图片-1', 'value': '图片-1', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-2', 'value': '图片-2', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-3', 'value': '图片-3', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-4', 'value': '图片-4', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}], 'multiple': True}, {'component': 'fac.AntdButton', 'id': 'generate-plot', 'children': '生成图片', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}], 'style': {'marginTop': '100px'}}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center', 'height': 400}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdSpace',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdSpace'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择图片布局', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdCheckCardGroup', 'children': [{'component': 'fac.AntdCheckCard', 'children': '1行1列', 'value': '1r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '1行2列', 'value': '1r2c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行1列', 'value': '2r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行2列', 'value': '2r2c', 'size': 'small'}], 'defaultValue': '1r1c'}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择图层', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdCascader', 'id': 'plot-axes-cascader', 'placeholder': '选择图层对象', 'options': [{'keep-dict-unrendered': True, 'label': '图片-1', 'value': '图片-1', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-2', 'value': '图片-2', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-3', 'value': '图片-3', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-4', 'value': '图片-4', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}], 'multiple': True}, {'component': 'fac.AntdButton', 'id': 'generate-plot', 'children': '生成图片', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}], 'style': {'marginTop': '100px'}}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择图片布局', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='html.Div',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'html.Div'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'fac.AntdDivider', 'children': '选择图片布局', 'innerTextOrientation': 'left'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdDivider', 'children': '选择图片布局', 'innerTextOrientation': 'left'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdDivider',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdDivider'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='children', attr_value='选择图片布局',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'选择图片布局'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='innerTextOrientation', attr_value='left',attr_value不是函数,attr_value加上引号

字符.attr_name='innerTextOrientation', attr_value="'left'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdDivider', 'children': '选择图片布局', 'innerTextOrientation': 'left'}],
渲染后:items="fac.AntdDivider(children = '选择图片布局', innerTextOrientation = 'left')",以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'width': 1000},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdCheckCardGroup', 'children': [{'component': 'fac.AntdCheckCard', 'children': '1行1列', 'value': '1r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '1行2列', 'value': '1r2c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行1列', 'value': '2r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行2列', 'value': '2r2c', 'size': 'small'}], 'defaultValue': '1r1c'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdCheckCardGroup',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdCheckCardGroup'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'fac.AntdCheckCard', 'children': '1行1列', 'value': '1r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '1行2列', 'value': '1r2c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行1列', 'value': '2r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行2列', 'value': '2r2c', 'size': 'small'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdCheckCard', 'children': '1行1列', 'value': '1r1c', 'size': 'small'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdCheckCard',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdCheckCard'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='children', attr_value='1行1列',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'1行1列'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='value', attr_value='1r1c',attr_value不是函数,attr_value加上引号

字符.attr_name='value', attr_value="'1r1c'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='size', attr_value='small',attr_value不是函数,attr_value加上引号

字符.attr_name='size', attr_value="'small'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdCheckCard', 'children': '1行2列', 'value': '1r2c', 'size': 'small'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdCheckCard',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdCheckCard'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='children', attr_value='1行2列',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'1行2列'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='value', attr_value='1r2c',attr_value不是函数,attr_value加上引号

字符.attr_name='value', attr_value="'1r2c'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='size', attr_value='small',attr_value不是函数,attr_value加上引号

字符.attr_name='size', attr_value="'small'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdCheckCard', 'children': '2行1列', 'value': '2r1c', 'size': 'small'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdCheckCard',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdCheckCard'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='children', attr_value='2行1列',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'2行1列'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='value', attr_value='2r1c',attr_value不是函数,attr_value加上引号

字符.attr_name='value', attr_value="'2r1c'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='size', attr_value='small',attr_value不是函数,attr_value加上引号

字符.attr_name='size', attr_value="'small'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdCheckCard', 'children': '2行2列', 'value': '2r2c', 'size': 'small'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdCheckCard',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdCheckCard'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='children', attr_value='2行2列',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'2行2列'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='value', attr_value='2r2c',attr_value不是函数,attr_value加上引号

字符.attr_name='value', attr_value="'2r2c'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='size', attr_value='small',attr_value不是函数,attr_value加上引号

字符.attr_name='size', attr_value="'small'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdCheckCard', 'children': '1行1列', 'value': '1r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '1行2列', 'value': '1r2c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行1列', 'value': '2r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行2列', 'value': '2r2c', 'size': 'small'}],
渲染后:items="fac.AntdCheckCard(children = '1行1列', value = '1r1c', size = 'small'), fac.AntdCheckCard(children = '1行2列', value = '1r2c', size = 'small'), fac.AntdCheckCard(children = '2行1列', value = '2r1c', size = 'small'), fac.AntdCheckCard(children = '2行2列', value = '2r2c', size = 'small')",以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='defaultValue', attr_value='1r1c',attr_value不是函数,attr_value加上引号

字符.attr_name='defaultValue', attr_value="'1r1c'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择图层', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='html.Div',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'html.Div'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'fac.AntdDivider', 'children': '选择图层', 'innerTextOrientation': 'left'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdDivider', 'children': '选择图层', 'innerTextOrientation': 'left'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdDivider',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdDivider'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='children', attr_value='选择图层',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'选择图层'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='innerTextOrientation', attr_value='left',attr_value不是函数,attr_value加上引号

字符.attr_name='innerTextOrientation', attr_value="'left'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdDivider', 'children': '选择图层', 'innerTextOrientation': 'left'}],
渲染后:items="fac.AntdDivider(children = '选择图层', innerTextOrientation = 'left')",以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'width': 1000},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdCascader', 'id': 'plot-axes-cascader', 'placeholder': '选择图层对象', 'options': [{'keep-dict-unrendered': True, 'label': '图片-1', 'value': '图片-1', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-2', 'value': '图片-2', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-3', 'value': '图片-3', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-4', 'value': '图片-4', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}], 'multiple': True},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdCascader',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdCascader'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='id', attr_value='plot-axes-cascader',attr_value不是函数,attr_value加上引号

字符.attr_name='id', attr_value="'plot-axes-cascader'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='placeholder', attr_value='选择图层对象',attr_value不是函数,attr_value加上引号

字符.attr_name='placeholder', attr_value="'选择图层对象'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表.attr_name='options', attr_value=[{'keep-dict-unrendered': True, 'label': '图片-1', 'value': '图片-1', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-2', 'value': '图片-2', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-3', 'value': '图片-3', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}, {'keep-dict-unrendered': True, 'label': '图片-4', 'value': '图片-4', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '图片-1', 'value': '图片-1', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='图片-1',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'图片-1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='图片-1',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'图片-1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'children'", attr_value=[{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-1',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-1',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-2',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-2',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-3',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-3',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-4',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-4'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-4',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-4'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='对角线',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'对角线'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='对角线',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'对角线'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='箱形图',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'箱形图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='箱形图',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'箱形图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='热图',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'热图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='热图',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'热图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='坐标轴',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'坐标轴'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='坐标轴',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'坐标轴'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='图注',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'图注'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='图注',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'图注'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}],
渲染后:items="{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}",以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '图片-2', 'value': '图片-2', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='图片-2',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'图片-2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='图片-2',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'图片-2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'children'", attr_value=[{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-1',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-1',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-2',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-2',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-3',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-3',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-4',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-4'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-4',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-4'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='对角线',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'对角线'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='对角线',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'对角线'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='箱形图',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'箱形图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='箱形图',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'箱形图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='热图',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'热图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='热图',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'热图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='坐标轴',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'坐标轴'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='坐标轴',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'坐标轴'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='图注',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'图注'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='图注',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'图注'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}],
渲染后:items="{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}",以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '图片-3', 'value': '图片-3', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='图片-3',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'图片-3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='图片-3',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'图片-3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'children'", attr_value=[{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-1',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-1',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-2',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-2',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-3',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-3',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-4',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-4'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-4',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-4'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='对角线',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'对角线'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='对角线',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'对角线'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='箱形图',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'箱形图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='箱形图',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'箱形图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='热图',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'热图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='热图',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'热图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='坐标轴',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'坐标轴'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='坐标轴',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'坐标轴'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='图注',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'图注'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='图注',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'图注'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}],
渲染后:items="{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}",以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '图片-4', 'value': '图片-4', 'children': [{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}]},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='图片-4',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'图片-4'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='图片-4',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'图片-4'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'children'", attr_value=[{'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'}, {'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'}, {'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'}, {'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'}, {'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'}, {'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'}, {'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'}, {'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'}, {'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-1', 'value': 'ROC-1'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-1',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-1',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-1'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-2', 'value': 'ROC-2'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-2',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-2',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-2'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-3', 'value': 'ROC-3'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-3',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-3',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-3'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': 'ROC-4', 'value': 'ROC-4'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='ROC-4',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'ROC-4'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='ROC-4',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'ROC-4'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '对角线', 'value': '对角线'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='对角线',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'对角线'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='对角线',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'对角线'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '箱形图', 'value': '箱形图'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='箱形图',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'箱形图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='箱形图',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'箱形图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '热图', 'value': '热图'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='热图',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'热图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='热图',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'热图'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '坐标轴', 'value': '坐标轴'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='坐标轴',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'坐标轴'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='坐标轴',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'坐标轴'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'label': '图注', 'value': '图注'},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'label'", attr_value='图注',attr_value不是函数,attr_value加上引号

字符.attr_name="'label'", attr_value="'图注'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'value'", attr_value='图注',attr_value不是函数,attr_value加上引号

字符.attr_name="'value'", attr_value="'图注'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}],
渲染后:items="{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}",以`attr_name : attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'label': '图片-1', 'value': '图片-1', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-2', 'value': '图片-2', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-3', 'value': '图片-3', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-4', 'value': '图片-4', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}],
渲染后:items="{'label' : '图片-1', 'value' : '图片-1', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}, {'label' : '图片-2', 'value' : '图片-2', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}, {'label' : '图片-3', 'value' : '图片-3', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}, {'label' : '图片-4', 'value' : '图片-4', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}",以`attr_name = attr_value`形式添加至组件列表

整数.attr_name='multiple', attr_value=True,attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdButton', 'id': 'generate-plot', 'children': '生成图片', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}], 'style': {'marginTop': '100px'}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdButton',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdButton'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='id', attr_value='generate-plot',attr_value不是函数,attr_value加上引号

字符.attr_name='id', attr_value="'generate-plot'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='children', attr_value='生成图片',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'生成图片'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='type', attr_value='primary',attr_value不是函数,attr_value加上引号

字符.attr_name='type', attr_value="'primary'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表.attr_name='icon', attr_value=[{'component': 'fac.AntdIcon', 'icon': 'md-layers'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdIcon', 'icon': 'md-layers'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdIcon',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdIcon'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='icon', attr_value='md-layers',attr_value不是函数,attr_value加上引号

字符.attr_name='icon', attr_value="'md-layers'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdIcon', 'icon': 'md-layers'}],
渲染后:items="fac.AntdIcon(icon = 'md-layers')",以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'marginTop': '100px'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择图片布局', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdCheckCardGroup', 'children': [{'component': 'fac.AntdCheckCard', 'children': '1行1列', 'value': '1r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '1行2列', 'value': '1r2c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行1列', 'value': '2r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行2列', 'value': '2r2c', 'size': 'small'}], 'defaultValue': '1r1c'}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择图层', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdCascader', 'id': 'plot-axes-cascader', 'placeholder': '选择图层对象', 'options': [{'label': '图片-1', 'value': '图片-1', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-2', 'value': '图片-2', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-3', 'value': '图片-3', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-4', 'value': '图片-4', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}], 'multiple': True}, {'component': 'fac.AntdButton', 'id': 'generate-plot', 'children': '生成图片', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}], 'style': {'marginTop': '100px'}}],
渲染后:items="html.Div(children = [fac.AntdDivider(children = '选择图片布局', innerTextOrientation = 'left')], style = {'width': 1000}), fac.AntdCheckCardGroup(children = [fac.AntdCheckCard(children = '1行1列', value = '1r1c', size = 'small'), fac.AntdCheckCard(children = '1行2列', value = '1r2c', size = 'small'), fac.AntdCheckCard(children = '2行1列', value = '2r1c', size = 'small'), fac.AntdCheckCard(children = '2行2列', value = '2r2c', size = 'small')], defaultValue = '1r1c'), html.Div(children = [fac.AntdDivider(children = '选择图层', innerTextOrientation = 'left')], style = {'width': 1000}), fac.AntdCascader(id = 'plot-axes-cascader', placeholder = '选择图层对象', options = [{'label' : '图片-1', 'value' : '图片-1', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}, {'label' : '图片-2', 'value' : '图片-2', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}, {'label' : '图片-3', 'value' : '图片-3', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}, {'label' : '图片-4', 'value' : '图片-4', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}], multiple = True), fac.AntdButton(id = 'generate-plot', children = '生成图片', type = 'primary', icon = [fac.AntdIcon(icon = 'md-layers')], style = {'marginTop': '100px'})",以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='direction', attr_value='vertical',attr_value不是函数,attr_value加上引号

字符.attr_name='direction', attr_value="'vertical'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center', 'height': 400},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdDivider', 'children': '作图'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择图片布局', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdCheckCardGroup', 'children': [{'component': 'fac.AntdCheckCard', 'children': '1行1列', 'value': '1r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '1行2列', 'value': '1r2c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行1列', 'value': '2r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行2列', 'value': '2r2c', 'size': 'small'}], 'defaultValue': '1r1c'}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择图层', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdCascader', 'id': 'plot-axes-cascader', 'placeholder': '选择图层对象', 'options': [{'label': '图片-1', 'value': '图片-1', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-2', 'value': '图片-2', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-3', 'value': '图片-3', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-4', 'value': '图片-4', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}], 'multiple': True}, {'component': 'fac.AntdButton', 'id': 'generate-plot', 'children': '生成图片', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}], 'style': {'marginTop': '100px'}}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center', 'height': 400}}],
渲染后:items="fac.AntdDivider(children = '作图'), fac.AntdSpace(children = [html.Div(children = [fac.AntdDivider(children = '选择图片布局', innerTextOrientation = 'left')], style = {'width': 1000}), fac.AntdCheckCardGroup(children = [fac.AntdCheckCard(children = '1行1列', value = '1r1c', size = 'small'), fac.AntdCheckCard(children = '1行2列', value = '1r2c', size = 'small'), fac.AntdCheckCard(children = '2行1列', value = '2r1c', size = 'small'), fac.AntdCheckCard(children = '2行2列', value = '2r2c', size = 'small')], defaultValue = '1r1c'), html.Div(children = [fac.AntdDivider(children = '选择图层', innerTextOrientation = 'left')], style = {'width': 1000}), fac.AntdCascader(id = 'plot-axes-cascader', placeholder = '选择图层对象', options = [{'label' : '图片-1', 'value' : '图片-1', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}, {'label' : '图片-2', 'value' : '图片-2', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}, {'label' : '图片-3', 'value' : '图片-3', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}, {'label' : '图片-4', 'value' : '图片-4', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}], multiple = True), fac.AntdButton(id = 'generate-plot', children = '生成图片', type = 'primary', icon = [fac.AntdIcon(icon = 'md-layers')], style = {'marginTop': '100px'})], direction = 'vertical', style = {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center', 'height': 400})",以`attr_name : attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'keep-dict-unrendered': True, 'title': '步骤6', 'subTitle': '图片展示', 'description': [{'component': 'fac.AntdDivider', 'children': '画廊'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '当前图片', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdImage', 'id': 'statical-single-plot', 'src': None, 'height': 600}]}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '历史图片', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdImage', 'id': {'type': 'image', 'index': 'display-multiple-plots'}, 'src': [], 'multiImageMode': 'unfold', 'height': 160}]}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center'}}]},
开始逐个元素渲染....
捕获keep_dict_unrendered键,attr_name和attr_value的连接符为冒号(:),括号为`{}`,并且删除keep-dict-unrendered键
连接符为冒号(:),attr_name加上引号

字符.attr_name="'title'", attr_value='步骤6',attr_value不是函数,attr_value加上引号

字符.attr_name="'title'", attr_value="'步骤6'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

字符.attr_name="'subTitle'", attr_value='图片展示',attr_value不是函数,attr_value加上引号

字符.attr_name="'subTitle'", attr_value="'图片展示'",attr_name不属于排除对象,以`attr_name : attr_value`形式添加至组件列表
连接符为冒号(:),attr_name加上引号

列表.attr_name="'description'", attr_value=[{'component': 'fac.AntdDivider', 'children': '画廊'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '当前图片', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdImage', 'id': 'statical-single-plot', 'src': None, 'height': 600}]}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '历史图片', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdImage', 'id': {'type': 'image', 'index': 'display-multiple-plots'}, 'src': [], 'multiImageMode': 'unfold', 'height': 160}]}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center'}}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdDivider', 'children': '画廊'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdDivider',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdDivider'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='children', attr_value='画廊',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'画廊'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '当前图片', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdImage', 'id': 'statical-single-plot', 'src': None, 'height': 600}]}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '历史图片', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdImage', 'id': {'type': 'image', 'index': 'display-multiple-plots'}, 'src': [], 'multiImageMode': 'unfold', 'height': 160}]}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center'}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdSpace',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdSpace'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '当前图片', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdImage', 'id': 'statical-single-plot', 'src': None, 'height': 600}]}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '历史图片', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdImage', 'id': {'type': 'image', 'index': 'display-multiple-plots'}, 'src': [], 'multiImageMode': 'unfold', 'height': 160}]}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '当前图片', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='html.Div',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'html.Div'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'fac.AntdDivider', 'children': '当前图片', 'innerTextOrientation': 'left'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdDivider', 'children': '当前图片', 'innerTextOrientation': 'left'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdDivider',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdDivider'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='children', attr_value='当前图片',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'当前图片'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='innerTextOrientation', attr_value='left',attr_value不是函数,attr_value加上引号

字符.attr_name='innerTextOrientation', attr_value="'left'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdDivider', 'children': '当前图片', 'innerTextOrientation': 'left'}],
渲染后:items="fac.AntdDivider(children = '当前图片', innerTextOrientation = 'left')",以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'width': 1000},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'html.Div', 'children': [{'component': 'fac.AntdImage', 'id': 'statical-single-plot', 'src': None, 'height': 600}]},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='html.Div',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'html.Div'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'fac.AntdImage', 'id': 'statical-single-plot', 'src': None, 'height': 600}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdImage', 'id': 'statical-single-plot', 'src': None, 'height': 600},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdImage',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdImage'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='id', attr_value='statical-single-plot',attr_value不是函数,attr_value加上引号

字符.attr_name='id', attr_value="'statical-single-plot'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

None.attr_name='src', attr_value=None, attr_value是空对象,不渲染,不添加

整数.attr_name='height', attr_value=600,attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdImage', 'id': 'statical-single-plot', 'src': None, 'height': 600}],
渲染后:items="fac.AntdImage(id = 'statical-single-plot', height = 600)",以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '历史图片', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='html.Div',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'html.Div'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'fac.AntdDivider', 'children': '历史图片', 'innerTextOrientation': 'left'}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdDivider', 'children': '历史图片', 'innerTextOrientation': 'left'},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdDivider',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdDivider'",attr_name属于排除对象,不添加至组件列表

字符.attr_name='children', attr_value='历史图片',attr_value不是函数,attr_value加上引号

字符.attr_name='children', attr_value="'历史图片'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='innerTextOrientation', attr_value='left',attr_value不是函数,attr_value加上引号

字符.attr_name='innerTextOrientation', attr_value="'left'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdDivider', 'children': '历史图片', 'innerTextOrientation': 'left'}],
渲染后:items="fac.AntdDivider(children = '历史图片', innerTextOrientation = 'left')",以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'width': 1000},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表


json_data是字典,符合渲染条件:json_data={'component': 'html.Div', 'children': [{'component': 'fac.AntdImage', 'id': {'type': 'image', 'index': 'display-multiple-plots'}, 'src': [], 'multiImageMode': 'unfold', 'height': 160}]},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='html.Div',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'html.Div'",attr_name属于排除对象,不添加至组件列表

列表.attr_name='children', attr_value=[{'component': 'fac.AntdImage', 'id': {'type': 'image', 'index': 'display-multiple-plots'}, 'src': [], 'multiImageMode': 'unfold', 'height': 160}],attr_value的元素是字典(以第1个元素判断),开始逐一渲染每个元素


json_data是字典,符合渲染条件:json_data={'component': 'fac.AntdImage', 'id': {'type': 'image', 'index': 'display-multiple-plots'}, 'src': [], 'multiImageMode': 'unfold', 'height': 160},
开始逐个元素渲染....
未捕获keep_dict_unrendered键,attr_name和attr_value的连接符为等号(=),括号为`()`

字符.attr_name='component', attr_value='fac.AntdImage',attr_value不是函数,attr_value加上引号

字符.attr_name='component', attr_value="'fac.AntdImage'",attr_name属于排除对象,不添加至组件列表

字典.attr_name='id', attr_value={'type': 'image', 'index': 'display-multiple-plots'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

列表.attr_name='src', attr_value=[],attr_value是空值,以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='multiImageMode', attr_value='unfold',attr_value不是函数,attr_value加上引号

字符.attr_name='multiImageMode', attr_value="'unfold'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

整数.attr_name='height', attr_value=160,attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdImage', 'id': {'type': 'image', 'index': 'display-multiple-plots'}, 'src': [], 'multiImageMode': 'unfold', 'height': 160}],
渲染后:items="fac.AntdImage(id = {'type': 'image', 'index': 'display-multiple-plots'}, src = [], multiImageMode = 'unfold', height = 160)",以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '当前图片', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdImage', 'id': 'statical-single-plot', 'src': None, 'height': 600}]}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '历史图片', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdImage', 'id': {'type': 'image', 'index': 'display-multiple-plots'}, 'src': [], 'multiImageMode': 'unfold', 'height': 160}]}],
渲染后:items="html.Div(children = [fac.AntdDivider(children = '当前图片', innerTextOrientation = 'left')], style = {'width': 1000}), html.Div(children = [fac.AntdImage(id = 'statical-single-plot', height = 600)]), html.Div(children = [fac.AntdDivider(children = '历史图片', innerTextOrientation = 'left')], style = {'width': 1000}), html.Div(children = [fac.AntdImage(id = {'type': 'image', 'index': 'display-multiple-plots'}, src = [], multiImageMode = 'unfold', height = 160)])",以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='direction', attr_value='vertical',attr_value不是函数,attr_value加上引号

字符.attr_name='direction', attr_value="'vertical'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'component': 'fac.AntdDivider', 'children': '画廊'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '当前图片', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdImage', 'id': 'statical-single-plot', 'src': None, 'height': 600}]}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '历史图片', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdImage', 'id': {'type': 'image', 'index': 'display-multiple-plots'}, 'src': [], 'multiImageMode': 'unfold', 'height': 160}]}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center'}}],
渲染后:items="fac.AntdDivider(children = '画廊'), fac.AntdSpace(children = [html.Div(children = [fac.AntdDivider(children = '当前图片', innerTextOrientation = 'left')], style = {'width': 1000}), html.Div(children = [fac.AntdImage(id = 'statical-single-plot', height = 600)]), html.Div(children = [fac.AntdDivider(children = '历史图片', innerTextOrientation = 'left')], style = {'width': 1000}), html.Div(children = [fac.AntdImage(id = {'type': 'image', 'index': 'display-multiple-plots'}, src = [], multiImageMode = 'unfold', height = 160)])], direction = 'vertical', style = {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center'})",以`attr_name : attr_value`形式添加至组件列表

列表渲染前:attr_value=[{'title': '步骤1', 'subTitle': '选择图层', 'description': [{'component': 'fac.AntdDivider', 'children': '图层'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdCascader', 'id': 'fig-axes-cascader', 'placeholder': '选择图层对象', 'expandTrigger': 'hover', 'options': [{'label': '图片-1', 'value': '图片-1', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-2', 'value': '图片-2', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-3', 'value': '图片-3', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-4', 'value': '图片-4', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}]}, {'component': 'fac.AntdText', 'id': 'current-ax', 'keyboard': True, 'children': None, 'style': {'font-size': 18}}], 'style': {'display': 'flex', 'justifyContent': 'center', 'alignItems': 'center', 'height': 200}}]}, {'title': '步骤2', 'subTitle': '上传数据', 'description': [{'component': 'fac.AntdDivider', 'children': '上传数据'}, {'component': 'fac.AntdDraggerUpload', 'id': 'upload-raw-data', 'apiUrl': '/upload/', 'fileMaxSize': 10, 'fileTypes': ['csv', 'xls', 'xlsx'], 'text': '请上传csv, xls或xlsx文件', 'hint': '选择Axes对象后,点击或拖拽文件至此处进行上传。', 'showUploadList': False, 'disabled': True}, {'component': 'fac.AntdTable', 'id': 'upload-raw-data-table'}]}, {'title': '步骤3', 'subTitle': '计算统计量', 'description': [{'component': 'fac.AntdDivider', 'children': '计算统计量'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择结局变量和自变量', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'options': None, 'placeholder': '选择结局变量(二分类因变量)', 'id': 'outcome-variable', 'style': {'width': 600}}, {'component': 'fac.AntdTransfer', 'titles': ['候选自变量', '选定自变量'], 'dataSource': None, 'targetKeys': None, 'showSearch': True, 'operations': ['放入', '移出'], 'id': 'independent-variable', 'height': 600, 'style': {'width': 600}}, {'component': 'fac.AntdSelect', 'id': 'fit-model', 'placeholder': '选择学习模型', 'options': [{'label': '逻辑回归', 'value': 'LogisticRegression'}, {'label': '随机森林', 'value': 'RandomForestClassifier'}], 'style': {'width': 200}}, {'component': 'fac.AntdButton', 'children': '计算统计量', 'id': 'calculate-statistics', 'autoSpin': True, 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '计算结果', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'id': 'calculated-statistical-result', 'children': []}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'center', 'alignItems': 'center'}}]}, {'title': '步骤4', 'subTitle': '设定图层参数', 'description': [{'component': 'fac.AntdDivider', 'children': '图层参数'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '图片格式', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'id': {'type': 'update-plot-params-value', 'index': 'theme-style'}, 'options': "f(generate_attr_dict_from_str_list, str_list = plt.style.available, dict_keys = ['label', 'value'])", 'placeholder': '选择主题', 'style': {'width': 300}}], 'direction': 'vertical'}, {'component': 'fac.AntdSpace', 'id': 'roc-ax-params', 'style': {'display': 'none'}, 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': 'ROC图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'roc'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'roc'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'roc'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'roc'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'roc'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'roc'}, 'defaultValue': '#1864ab', 'options': [{'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'group': 'RGB', 'options': [{'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'group': 'HEX', 'options': [{'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '曲线平滑度', 'keyboard': True, 'style': {'font-size': 18, 'marginTop': '10px'}}, {'component': 'fac.AntdCheckbox', 'id': {'type': 'update-plot-params-check', 'index': 'smooth-line'}, 'label': '平滑', 'style': {'marginTop': '10px'}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'id': {'type': 'update-plot-params-value', 'index': 'line-width-roc'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'style': {'marginTop': '10px'}}]}], 'direction': 'vertical'}, {'component': 'fac.AntdSpace', 'id': 'diagonal-ax-params', 'style': {'display': 'none'}, 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '对角线图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'diagonal'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'diagonal'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'diagonal'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'diagonal'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'diagonal'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'diagonal'}, 'defaultValue': '#1864ab', 'options': [{'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'group': 'RGB', 'options': [{'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'group': 'HEX', 'options': [{'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'id': {'type': 'update-plot-params-value', 'index': 'line-width-diagonal'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'style': {'marginTop': '10px'}}]}], 'direction': 'vertical'}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center'}}]}, {'title': '步骤5', 'subTitle': '作图', 'description': [{'component': 'fac.AntdDivider', 'children': '作图'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择图片布局', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdCheckCardGroup', 'children': [{'component': 'fac.AntdCheckCard', 'children': '1行1列', 'value': '1r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '1行2列', 'value': '1r2c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行1列', 'value': '2r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行2列', 'value': '2r2c', 'size': 'small'}], 'defaultValue': '1r1c'}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择图层', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdCascader', 'id': 'plot-axes-cascader', 'placeholder': '选择图层对象', 'options': [{'label': '图片-1', 'value': '图片-1', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-2', 'value': '图片-2', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-3', 'value': '图片-3', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-4', 'value': '图片-4', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}], 'multiple': True}, {'component': 'fac.AntdButton', 'id': 'generate-plot', 'children': '生成图片', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}], 'style': {'marginTop': '100px'}}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center', 'height': 400}}]}, {'title': '步骤6', 'subTitle': '图片展示', 'description': [{'component': 'fac.AntdDivider', 'children': '画廊'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '当前图片', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdImage', 'id': 'statical-single-plot', 'src': None, 'height': 600}]}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '历史图片', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdImage', 'id': {'type': 'image', 'index': 'display-multiple-plots'}, 'src': [], 'multiImageMode': 'unfold', 'height': 160}]}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center'}}]}],
渲染后:items='{\'title\' : \'步骤1\', \'subTitle\' : \'选择图层\', \'description\' : [fac.AntdDivider(children = \'图层\'), fac.AntdSpace(children = [fac.AntdCascader(id = \'fig-axes-cascader\', placeholder = \'选择图层对象\', expandTrigger = \'hover\', options = [{\'label\' : \'图片-1\', \'value\' : \'图片-1\', \'children\' : [{\'label\' : \'ROC-1\', \'value\' : \'ROC-1\'}, {\'label\' : \'ROC-2\', \'value\' : \'ROC-2\'}, {\'label\' : \'ROC-3\', \'value\' : \'ROC-3\'}, {\'label\' : \'ROC-4\', \'value\' : \'ROC-4\'}, {\'label\' : \'对角线\', \'value\' : \'对角线\'}, {\'label\' : \'箱形图\', \'value\' : \'箱形图\'}, {\'label\' : \'热图\', \'value\' : \'热图\'}, {\'label\' : \'坐标轴\', \'value\' : \'坐标轴\'}, {\'label\' : \'图注\', \'value\' : \'图注\'}]}, {\'label\' : \'图片-2\', \'value\' : \'图片-2\', \'children\' : [{\'label\' : \'ROC-1\', \'value\' : \'ROC-1\'}, {\'label\' : \'ROC-2\', \'value\' : \'ROC-2\'}, {\'label\' : \'ROC-3\', \'value\' : \'ROC-3\'}, {\'label\' : \'ROC-4\', \'value\' : \'ROC-4\'}, {\'label\' : \'对角线\', \'value\' : \'对角线\'}, {\'label\' : \'箱形图\', \'value\' : \'箱形图\'}, {\'label\' : \'热图\', \'value\' : \'热图\'}, {\'label\' : \'坐标轴\', \'value\' : \'坐标轴\'}, {\'label\' : \'图注\', \'value\' : \'图注\'}]}, {\'label\' : \'图片-3\', \'value\' : \'图片-3\', \'children\' : [{\'label\' : \'ROC-1\', \'value\' : \'ROC-1\'}, {\'label\' : \'ROC-2\', \'value\' : \'ROC-2\'}, {\'label\' : \'ROC-3\', \'value\' : \'ROC-3\'}, {\'label\' : \'ROC-4\', \'value\' : \'ROC-4\'}, {\'label\' : \'对角线\', \'value\' : \'对角线\'}, {\'label\' : \'箱形图\', \'value\' : \'箱形图\'}, {\'label\' : \'热图\', \'value\' : \'热图\'}, {\'label\' : \'坐标轴\', \'value\' : \'坐标轴\'}, {\'label\' : \'图注\', \'value\' : \'图注\'}]}, {\'label\' : \'图片-4\', \'value\' : \'图片-4\', \'children\' : [{\'label\' : \'ROC-1\', \'value\' : \'ROC-1\'}, {\'label\' : \'ROC-2\', \'value\' : \'ROC-2\'}, {\'label\' : \'ROC-3\', \'value\' : \'ROC-3\'}, {\'label\' : \'ROC-4\', \'value\' : \'ROC-4\'}, {\'label\' : \'对角线\', \'value\' : \'对角线\'}, {\'label\' : \'箱形图\', \'value\' : \'箱形图\'}, {\'label\' : \'热图\', \'value\' : \'热图\'}, {\'label\' : \'坐标轴\', \'value\' : \'坐标轴\'}, {\'label\' : \'图注\', \'value\' : \'图注\'}]}]), fac.AntdText(id = \'current-ax\', keyboard = True, style = {\'font-size\': 18})], style = {\'display\': \'flex\', \'justifyContent\': \'center\', \'alignItems\': \'center\', \'height\': 200})]}, {\'title\' : \'步骤2\', \'subTitle\' : \'上传数据\', \'description\' : [fac.AntdDivider(children = \'上传数据\'), fac.AntdDraggerUpload(id = \'upload-raw-data\', apiUrl = \'/upload/\', fileMaxSize = 10, fileTypes = [\'csv\', \'xls\', \'xlsx\'], text = \'请上传csv, xls或xlsx文件\', hint = \'选择Axes对象后,点击或拖拽文件至此处进行上传。\', showUploadList = False, disabled = True), fac.AntdTable(id = \'upload-raw-data-table\')]}, {\'title\' : \'步骤3\', \'subTitle\' : \'计算统计量\', \'description\' : [fac.AntdDivider(children = \'计算统计量\'), fac.AntdSpace(children = [html.Div(children = [fac.AntdDivider(children = \'选择结局变量和自变量\', innerTextOrientation = \'left\')], style = {\'width\': 1000}), fac.AntdSelect(placeholder = \'选择结局变量(二分类因变量)\', id = \'outcome-variable\', style = {\'width\': 600}), fac.AntdTransfer(titles = [\'候选自变量\', \'选定自变量\'], showSearch = True, operations = [\'放入\', \'移出\'], id = \'independent-variable\', height = 600, style = {\'width\': 600}), fac.AntdSelect(id = \'fit-model\', placeholder = \'选择学习模型\', options = [{\'label\' : \'逻辑回归\', \'value\' : \'LogisticRegression\'}, {\'label\' : \'随机森林\', \'value\' : \'RandomForestClassifier\'}], style = {\'width\': 200}), fac.AntdButton(children = \'计算统计量\', id = \'calculate-statistics\', autoSpin = True, type = \'primary\', icon = [fac.AntdIcon(icon = \'md-layers\')]), html.Div(children = [fac.AntdDivider(children = \'计算结果\', innerTextOrientation = \'left\')], style = {\'width\': 1000}), html.Div(id = \'calculated-statistical-result\', children = [])], direction = \'vertical\', style = {\'display\': \'flex\', \'justifyContent\': \'center\', \'alignItems\': \'center\'})]}, {\'title\' : \'步骤4\', \'subTitle\' : \'设定图层参数\', \'description\' : [fac.AntdDivider(children = \'图层参数\'), fac.AntdSpace(children = [fac.AntdSpace(children = [html.Div(children = [fac.AntdDivider(children = \'图片格式\', innerTextOrientation = \'left\')], style = {\'width\': 1000}), fac.AntdSelect(id = {\'type\': \'update-plot-params-value\', \'index\': \'theme-style\'}, options = generate_attr_dict_from_str_list( str_list = plt.style.available, dict_keys = [\'label\', \'value\']), placeholder = \'选择主题\', style = {\'width\': 300})], direction = \'vertical\'), fac.AntdSpace(id = \'roc-ax-params\', style = {\'display\': \'none\'}, children = [html.Div(children = [fac.AntdDivider(children = \'ROC图层参数\', innerTextOrientation = \'left\')], style = {\'width\': 1000}), fac.AntdSpace(children = [fac.AntdText(children = \'颜色\', keyboard = True, style = {\'font-size\': 18}), fac.AntdButton(id = {\'type\': \'open-color-palette\', \'index\': \'roc\'}, children = \'调色板\', type = \'primary\', icon = [fac.AntdIcon(icon = \'md-layers\')]), fac.AntdModal(id = {\'type\': \'custom-color-picker\', \'index\': \'roc\'}, children = [fac.AntdSpace(children = [fuc.FefferyWheelColorPicker(id = {\'type\': \'color-wheel-selector\', \'index\': \'roc\'}), html.Div(id = {\'type\': \'wheel-color-div\', \'index\': \'roc\'}, style = {\'width\': \'200px\', \'height\': \'200px\', \'display\': \'flex\', \'alignItems\': \'center\', \'justifyContent\': \'center\', "borderRadius\'": \'5px\', \'boxShadow\': \'0px 0px 12px rgba(0, 0, 0, .12)\', \'transition\': \'0.25s\', \'backround\': \'#fffc51\'}), fuc.FefferyTwitterColorPicker(id = {\'type\': \'color-twitter-selector\', \'index\': \'roc\'}, colors = [\'#fff4ce\', \'#797673\', \'#fed9cc\', \'#d83b01\', \'#fde7e9\', \'#a80000\', \'#dff6dd\', \'#107c10\'])])], title = \'选择自定义颜色\', renderFooter = True, width = 800), fac.AntdSelect(id = {\'type\': \'custom-color-selector\', \'index\': \'roc\'}, defaultValue = \'#1864ab\', options = [{\'label\' : \'自定义色\', \'value\' : \'#1864ab\', \'colors\' : [\'#1864ab\']}], colorsMode = \'diverging\', disabled = False, style = {\'width\': 200}), fac.AntdSelect(defaultValue = \'配色1\', options = [{\'label\' : \'配色1\', \'value\' : \'配色1\', \'colors\' : [\'#fff5f5\', \'#ff8787\', \'#c92a2a\']}, {\'label\' : \'配色2\', \'value\' : \'配色2\', \'colors\' : [\'#f8f0fc\', \'#da77f2\', \'#862e9c\']}, {\'label\' : \'配色3\', \'value\' : \'配色3\', \'colors\' : [\'#e7f5ff\', \'#4dabf7\', \'#1864ab\']}], colorsMode = \'diverging\', style = {\'width\': 200}), fac.AntdSelect(defaultValue = \'RGB1\', options = [{\'group\' : \'RGB\', \'options\' : [{\'label\' : \'颜色1\', \'value\' : \'RGB1\', \'colors\' : [\'#fff5f5\']}, {\'label\' : \'颜色2\', \'value\' : \'RGB2\', \'colors\' : [\'#ff8787\']}, {\'label\' : \'颜色3\', \'value\' : \'RGB3\', \'colors\' : [\'#c92a2a\']}]}, {\'group\' : \'HEX\', \'options\' : [{\'label\' : \'颜色1\', \'value\' : \'HEX1\', \'colors\' : [\'#f8f0fc\']}, {\'label\' : \'颜色2\', \'value\' : \'HEX2\', \'colors\' : [\'#da77f2\']}, {\'label\' : \'颜色3\', \'value\' : \'HEX3\', \'colors\' : [\'#862e9c\']}]}], colorsMode = \'diverging\', style = {\'width\': 200})]), fac.AntdSpace(children = [fac.AntdText(children = \'曲线平滑度\', keyboard = True, style = {\'font-size\': 18, \'marginTop\': \'10px\'}), fac.AntdCheckbox(id = {\'type\': \'update-plot-params-check\', \'index\': \'smooth-line\'}, label = \'平滑\', style = {\'marginTop\': \'10px\'})]), fac.AntdSpace(children = [fac.AntdText(children = \'线条样式\', keyboard = True, style = {\'font-size\': 18}), fac.AntdInputNumber(max = 5, defaultValue = 1, id = {\'type\': \'update-plot-params-value\', \'index\': \'line-width-roc\'}, addonBefore = \'线条粗细\', prefix = [fac.AntdIcon(icon = \'antd-control\')], style = {\'marginTop\': \'10px\'})])], direction = \'vertical\'), fac.AntdSpace(id = \'diagonal-ax-params\', style = {\'display\': \'none\'}, children = [html.Div(children = [fac.AntdDivider(children = \'对角线图层参数\', innerTextOrientation = \'left\')], style = {\'width\': 1000}), fac.AntdSpace(children = [fac.AntdText(children = \'颜色\', keyboard = True, style = {\'font-size\': 18}), fac.AntdButton(id = {\'type\': \'open-color-palette\', \'index\': \'diagonal\'}, children = \'调色板\', type = \'primary\', icon = [fac.AntdIcon(icon = \'md-layers\')]), fac.AntdModal(id = {\'type\': \'custom-color-picker\', \'index\': \'diagonal\'}, children = [fac.AntdSpace(children = [fuc.FefferyWheelColorPicker(id = {\'type\': \'color-wheel-selector\', \'index\': \'diagonal\'}), html.Div(id = {\'type\': \'wheel-color-div\', \'index\': \'diagonal\'}, style = {\'width\': \'200px\', \'height\': \'200px\', \'display\': \'flex\', \'alignItems\': \'center\', \'justifyContent\': \'center\', "borderRadius\'": \'5px\', \'boxShadow\': \'0px 0px 12px rgba(0, 0, 0, .12)\', \'transition\': \'0.25s\', \'backround\': \'#fffc51\'}), fuc.FefferyTwitterColorPicker(id = {\'type\': \'color-twitter-selector\', \'index\': \'diagonal\'}, colors = [\'#fff4ce\', \'#797673\', \'#fed9cc\', \'#d83b01\', \'#fde7e9\', \'#a80000\', \'#dff6dd\', \'#107c10\'])])], title = \'选择自定义颜色\', renderFooter = True, width = 800), fac.AntdSelect(id = {\'type\': \'custom-color-selector\', \'index\': \'diagonal\'}, defaultValue = \'#1864ab\', options = [{\'label\' : \'自定义色\', \'value\' : \'#1864ab\', \'colors\' : [\'#1864ab\']}], colorsMode = \'diverging\', disabled = False, style = {\'width\': 200}), fac.AntdSelect(defaultValue = \'配色1\', options = [{\'label\' : \'配色1\', \'value\' : \'配色1\', \'colors\' : [\'#fff5f5\', \'#ff8787\', \'#c92a2a\']}, {\'label\' : \'配色2\', \'value\' : \'配色2\', \'colors\' : [\'#f8f0fc\', \'#da77f2\', \'#862e9c\']}, {\'label\' : \'配色3\', \'value\' : \'配色3\', \'colors\' : [\'#e7f5ff\', \'#4dabf7\', \'#1864ab\']}], colorsMode = \'diverging\', style = {\'width\': 200}), fac.AntdSelect(defaultValue = \'RGB1\', options = [{\'group\' : \'RGB\', \'options\' : [{\'label\' : \'颜色1\', \'value\' : \'RGB1\', \'colors\' : [\'#fff5f5\']}, {\'label\' : \'颜色2\', \'value\' : \'RGB2\', \'colors\' : [\'#ff8787\']}, {\'label\' : \'颜色3\', \'value\' : \'RGB3\', \'colors\' : [\'#c92a2a\']}]}, {\'group\' : \'HEX\', \'options\' : [{\'label\' : \'颜色1\', \'value\' : \'HEX1\', \'colors\' : [\'#f8f0fc\']}, {\'label\' : \'颜色2\', \'value\' : \'HEX2\', \'colors\' : [\'#da77f2\']}, {\'label\' : \'颜色3\', \'value\' : \'HEX3\', \'colors\' : [\'#862e9c\']}]}], colorsMode = \'diverging\', style = {\'width\': 200})]), fac.AntdSpace(children = [fac.AntdText(children = \'线条样式\', keyboard = True, style = {\'font-size\': 18}), fac.AntdInputNumber(id = {\'type\': \'update-plot-params-value\', \'index\': \'line-width-diagonal\'}, addonBefore = \'线条粗细\', prefix = [fac.AntdIcon(icon = \'antd-control\')], max = 5, defaultValue = 1, style = {\'marginTop\': \'10px\'})])], direction = \'vertical\')], direction = \'vertical\', style = {\'display\': \'flex\', \'justifyContent\': \'left\', \'alignItems\': \'center\'})]}, {\'title\' : \'步骤5\', \'subTitle\' : \'作图\', \'description\' : [fac.AntdDivider(children = \'作图\'), fac.AntdSpace(children = [html.Div(children = [fac.AntdDivider(children = \'选择图片布局\', innerTextOrientation = \'left\')], style = {\'width\': 1000}), fac.AntdCheckCardGroup(children = [fac.AntdCheckCard(children = \'1行1列\', value = \'1r1c\', size = \'small\'), fac.AntdCheckCard(children = \'1行2列\', value = \'1r2c\', size = \'small\'), fac.AntdCheckCard(children = \'2行1列\', value = \'2r1c\', size = \'small\'), fac.AntdCheckCard(children = \'2行2列\', value = \'2r2c\', size = \'small\')], defaultValue = \'1r1c\'), html.Div(children = [fac.AntdDivider(children = \'选择图层\', innerTextOrientation = \'left\')], style = {\'width\': 1000}), fac.AntdCascader(id = \'plot-axes-cascader\', placeholder = \'选择图层对象\', options = [{\'label\' : \'图片-1\', \'value\' : \'图片-1\', \'children\' : [{\'label\' : \'ROC-1\', \'value\' : \'ROC-1\'}, {\'label\' : \'ROC-2\', \'value\' : \'ROC-2\'}, {\'label\' : \'ROC-3\', \'value\' : \'ROC-3\'}, {\'label\' : \'ROC-4\', \'value\' : \'ROC-4\'}, {\'label\' : \'对角线\', \'value\' : \'对角线\'}, {\'label\' : \'箱形图\', \'value\' : \'箱形图\'}, {\'label\' : \'热图\', \'value\' : \'热图\'}, {\'label\' : \'坐标轴\', \'value\' : \'坐标轴\'}, {\'label\' : \'图注\', \'value\' : \'图注\'}]}, {\'label\' : \'图片-2\', \'value\' : \'图片-2\', \'children\' : [{\'label\' : \'ROC-1\', \'value\' : \'ROC-1\'}, {\'label\' : \'ROC-2\', \'value\' : \'ROC-2\'}, {\'label\' : \'ROC-3\', \'value\' : \'ROC-3\'}, {\'label\' : \'ROC-4\', \'value\' : \'ROC-4\'}, {\'label\' : \'对角线\', \'value\' : \'对角线\'}, {\'label\' : \'箱形图\', \'value\' : \'箱形图\'}, {\'label\' : \'热图\', \'value\' : \'热图\'}, {\'label\' : \'坐标轴\', \'value\' : \'坐标轴\'}, {\'label\' : \'图注\', \'value\' : \'图注\'}]}, {\'label\' : \'图片-3\', \'value\' : \'图片-3\', \'children\' : [{\'label\' : \'ROC-1\', \'value\' : \'ROC-1\'}, {\'label\' : \'ROC-2\', \'value\' : \'ROC-2\'}, {\'label\' : \'ROC-3\', \'value\' : \'ROC-3\'}, {\'label\' : \'ROC-4\', \'value\' : \'ROC-4\'}, {\'label\' : \'对角线\', \'value\' : \'对角线\'}, {\'label\' : \'箱形图\', \'value\' : \'箱形图\'}, {\'label\' : \'热图\', \'value\' : \'热图\'}, {\'label\' : \'坐标轴\', \'value\' : \'坐标轴\'}, {\'label\' : \'图注\', \'value\' : \'图注\'}]}, {\'label\' : \'图片-4\', \'value\' : \'图片-4\', \'children\' : [{\'label\' : \'ROC-1\', \'value\' : \'ROC-1\'}, {\'label\' : \'ROC-2\', \'value\' : \'ROC-2\'}, {\'label\' : \'ROC-3\', \'value\' : \'ROC-3\'}, {\'label\' : \'ROC-4\', \'value\' : \'ROC-4\'}, {\'label\' : \'对角线\', \'value\' : \'对角线\'}, {\'label\' : \'箱形图\', \'value\' : \'箱形图\'}, {\'label\' : \'热图\', \'value\' : \'热图\'}, {\'label\' : \'坐标轴\', \'value\' : \'坐标轴\'}, {\'label\' : \'图注\', \'value\' : \'图注\'}]}], multiple = True), fac.AntdButton(id = \'generate-plot\', children = \'生成图片\', type = \'primary\', icon = [fac.AntdIcon(icon = \'md-layers\')], style = {\'marginTop\': \'100px\'})], direction = \'vertical\', style = {\'display\': \'flex\', \'justifyContent\': \'left\', \'alignItems\': \'center\', \'height\': 400})]}, {\'title\' : \'步骤6\', \'subTitle\' : \'图片展示\', \'description\' : [fac.AntdDivider(children = \'画廊\'), fac.AntdSpace(children = [html.Div(children = [fac.AntdDivider(children = \'当前图片\', innerTextOrientation = \'left\')], style = {\'width\': 1000}), html.Div(children = [fac.AntdImage(id = \'statical-single-plot\', height = 600)]), html.Div(children = [fac.AntdDivider(children = \'历史图片\', innerTextOrientation = \'left\')], style = {\'width\': 1000}), html.Div(children = [fac.AntdImage(id = {\'type\': \'image\', \'index\': \'display-multiple-plots\'}, src = [], multiImageMode = \'unfold\', height = 160)])], direction = \'vertical\', style = {\'display\': \'flex\', \'justifyContent\': \'left\', \'alignItems\': \'center\'})]}',以`attr_name = attr_value`形式添加至组件列表

字符.attr_name='direction', attr_value='vertical',attr_value不是函数,attr_value加上引号

字符.attr_name='direction', attr_value="'vertical'",attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表

整数.attr_name='allowClick', attr_value=True,attr_name不属于排除对象,以`attr_name = attr_value`形式添加至组件列表添加至组件列表

列表渲染前:attr_value=[{'component': 'html.Div', 'children': None, 'id': 'message-container'}, {'component': 'fac.AntdSteps', 'steps': [{'title': '步骤1', 'subTitle': '选择图层', 'description': [{'component': 'fac.AntdDivider', 'children': '图层'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdCascader', 'id': 'fig-axes-cascader', 'placeholder': '选择图层对象', 'expandTrigger': 'hover', 'options': [{'label': '图片-1', 'value': '图片-1', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-2', 'value': '图片-2', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-3', 'value': '图片-3', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-4', 'value': '图片-4', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}]}, {'component': 'fac.AntdText', 'id': 'current-ax', 'keyboard': True, 'children': None, 'style': {'font-size': 18}}], 'style': {'display': 'flex', 'justifyContent': 'center', 'alignItems': 'center', 'height': 200}}]}, {'title': '步骤2', 'subTitle': '上传数据', 'description': [{'component': 'fac.AntdDivider', 'children': '上传数据'}, {'component': 'fac.AntdDraggerUpload', 'id': 'upload-raw-data', 'apiUrl': '/upload/', 'fileMaxSize': 10, 'fileTypes': ['csv', 'xls', 'xlsx'], 'text': '请上传csv, xls或xlsx文件', 'hint': '选择Axes对象后,点击或拖拽文件至此处进行上传。', 'showUploadList': False, 'disabled': True}, {'component': 'fac.AntdTable', 'id': 'upload-raw-data-table'}]}, {'title': '步骤3', 'subTitle': '计算统计量', 'description': [{'component': 'fac.AntdDivider', 'children': '计算统计量'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择结局变量和自变量', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'options': None, 'placeholder': '选择结局变量(二分类因变量)', 'id': 'outcome-variable', 'style': {'width': 600}}, {'component': 'fac.AntdTransfer', 'titles': ['候选自变量', '选定自变量'], 'dataSource': None, 'targetKeys': None, 'showSearch': True, 'operations': ['放入', '移出'], 'id': 'independent-variable', 'height': 600, 'style': {'width': 600}}, {'component': 'fac.AntdSelect', 'id': 'fit-model', 'placeholder': '选择学习模型', 'options': [{'label': '逻辑回归', 'value': 'LogisticRegression'}, {'label': '随机森林', 'value': 'RandomForestClassifier'}], 'style': {'width': 200}}, {'component': 'fac.AntdButton', 'children': '计算统计量', 'id': 'calculate-statistics', 'autoSpin': True, 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '计算结果', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'id': 'calculated-statistical-result', 'children': []}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'center', 'alignItems': 'center'}}]}, {'title': '步骤4', 'subTitle': '设定图层参数', 'description': [{'component': 'fac.AntdDivider', 'children': '图层参数'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '图片格式', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSelect', 'id': {'type': 'update-plot-params-value', 'index': 'theme-style'}, 'options': "f(generate_attr_dict_from_str_list, str_list = plt.style.available, dict_keys = ['label', 'value'])", 'placeholder': '选择主题', 'style': {'width': 300}}], 'direction': 'vertical'}, {'component': 'fac.AntdSpace', 'id': 'roc-ax-params', 'style': {'display': 'none'}, 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': 'ROC图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'roc'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'roc'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'roc'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'roc'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'roc'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'roc'}, 'defaultValue': '#1864ab', 'options': [{'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'group': 'RGB', 'options': [{'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'group': 'HEX', 'options': [{'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '曲线平滑度', 'keyboard': True, 'style': {'font-size': 18, 'marginTop': '10px'}}, {'component': 'fac.AntdCheckbox', 'id': {'type': 'update-plot-params-check', 'index': 'smooth-line'}, 'label': '平滑', 'style': {'marginTop': '10px'}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'id': {'type': 'update-plot-params-value', 'index': 'line-width-roc'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'style': {'marginTop': '10px'}}]}], 'direction': 'vertical'}, {'component': 'fac.AntdSpace', 'id': 'diagonal-ax-params', 'style': {'display': 'none'}, 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '对角线图层参数', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '颜色', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdButton', 'id': {'type': 'open-color-palette', 'index': 'diagonal'}, 'children': '调色板', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}]}, {'component': 'fac.AntdModal', 'id': {'type': 'custom-color-picker', 'index': 'diagonal'}, 'children': [{'component': 'fac.AntdSpace', 'children': [{'component': 'fuc.FefferyWheelColorPicker', 'id': {'type': 'color-wheel-selector', 'index': 'diagonal'}}, {'component': 'html.Div', 'id': {'type': 'wheel-color-div', 'index': 'diagonal'}, 'style': {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}}, {'component': 'fuc.FefferyTwitterColorPicker', 'id': {'type': 'color-twitter-selector', 'index': 'diagonal'}, 'colors': ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10']}]}], 'title': '选择自定义颜色', 'renderFooter': True, 'width': 800}, {'component': 'fac.AntdSelect', 'id': {'type': 'custom-color-selector', 'index': 'diagonal'}, 'defaultValue': '#1864ab', 'options': [{'label': '自定义色', 'value': '#1864ab', 'colors': ['#1864ab']}], 'colorsMode': 'diverging', 'disabled': False, 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': '配色1', 'options': [{'label': '配色1', 'value': '配色1', 'colors': ['#fff5f5', '#ff8787', '#c92a2a']}, {'label': '配色2', 'value': '配色2', 'colors': ['#f8f0fc', '#da77f2', '#862e9c']}, {'label': '配色3', 'value': '配色3', 'colors': ['#e7f5ff', '#4dabf7', '#1864ab']}], 'colorsMode': 'diverging', 'style': {'width': 200}}, {'component': 'fac.AntdSelect', 'defaultValue': 'RGB1', 'options': [{'group': 'RGB', 'options': [{'label': '颜色1', 'value': 'RGB1', 'colors': ['#fff5f5']}, {'label': '颜色2', 'value': 'RGB2', 'colors': ['#ff8787']}, {'label': '颜色3', 'value': 'RGB3', 'colors': ['#c92a2a']}]}, {'group': 'HEX', 'options': [{'label': '颜色1', 'value': 'HEX1', 'colors': ['#f8f0fc']}, {'label': '颜色2', 'value': 'HEX2', 'colors': ['#da77f2']}, {'label': '颜色3', 'value': 'HEX3', 'colors': ['#862e9c']}]}], 'colorsMode': 'diverging', 'style': {'width': 200}}]}, {'component': 'fac.AntdSpace', 'children': [{'component': 'fac.AntdText', 'children': '线条样式', 'keyboard': True, 'style': {'font-size': 18}}, {'component': 'fac.AntdInputNumber', 'id': {'type': 'update-plot-params-value', 'index': 'line-width-diagonal'}, 'addonBefore': '线条粗细', 'prefix': [{'component': 'fac.AntdIcon', 'icon': 'antd-control'}], 'min': 0.5, 'step': 0.1, 'max': 5, 'defaultValue': 1, 'style': {'marginTop': '10px'}}]}], 'direction': 'vertical'}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center'}}]}, {'title': '步骤5', 'subTitle': '作图', 'description': [{'component': 'fac.AntdDivider', 'children': '作图'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择图片布局', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdCheckCardGroup', 'children': [{'component': 'fac.AntdCheckCard', 'children': '1行1列', 'value': '1r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '1行2列', 'value': '1r2c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行1列', 'value': '2r1c', 'size': 'small'}, {'component': 'fac.AntdCheckCard', 'children': '2行2列', 'value': '2r2c', 'size': 'small'}], 'defaultValue': '1r1c'}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '选择图层', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'fac.AntdCascader', 'id': 'plot-axes-cascader', 'placeholder': '选择图层对象', 'options': [{'label': '图片-1', 'value': '图片-1', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-2', 'value': '图片-2', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-3', 'value': '图片-3', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}, {'label': '图片-4', 'value': '图片-4', 'children': [{'label': 'ROC-1', 'value': 'ROC-1'}, {'label': 'ROC-2', 'value': 'ROC-2'}, {'label': 'ROC-3', 'value': 'ROC-3'}, {'label': 'ROC-4', 'value': 'ROC-4'}, {'label': '对角线', 'value': '对角线'}, {'label': '箱形图', 'value': '箱形图'}, {'label': '热图', 'value': '热图'}, {'label': '坐标轴', 'value': '坐标轴'}, {'label': '图注', 'value': '图注'}]}], 'multiple': True}, {'component': 'fac.AntdButton', 'id': 'generate-plot', 'children': '生成图片', 'type': 'primary', 'icon': [{'component': 'fac.AntdIcon', 'icon': 'md-layers'}], 'style': {'marginTop': '100px'}}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center', 'height': 400}}]}, {'title': '步骤6', 'subTitle': '图片展示', 'description': [{'component': 'fac.AntdDivider', 'children': '画廊'}, {'component': 'fac.AntdSpace', 'children': [{'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '当前图片', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdImage', 'id': 'statical-single-plot', 'src': None, 'height': 600}]}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdDivider', 'children': '历史图片', 'innerTextOrientation': 'left'}], 'style': {'width': 1000}}, {'component': 'html.Div', 'children': [{'component': 'fac.AntdImage', 'id': {'type': 'image', 'index': 'display-multiple-plots'}, 'src': [], 'multiImageMode': 'unfold', 'height': 160}]}], 'direction': 'vertical', 'style': {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center'}}]}], 'direction': 'vertical', 'allowClick': True}],
渲染后:items='html.Div(id = \'message-container\'), fac.AntdSteps(steps = [{\'title\' : \'步骤1\', \'subTitle\' : \'选择图层\', \'description\' : [fac.AntdDivider(children = \'图层\'), fac.AntdSpace(children = [fac.AntdCascader(id = \'fig-axes-cascader\', placeholder = \'选择图层对象\', expandTrigger = \'hover\', options = [{\'label\' : \'图片-1\', \'value\' : \'图片-1\', \'children\' : [{\'label\' : \'ROC-1\', \'value\' : \'ROC-1\'}, {\'label\' : \'ROC-2\', \'value\' : \'ROC-2\'}, {\'label\' : \'ROC-3\', \'value\' : \'ROC-3\'}, {\'label\' : \'ROC-4\', \'value\' : \'ROC-4\'}, {\'label\' : \'对角线\', \'value\' : \'对角线\'}, {\'label\' : \'箱形图\', \'value\' : \'箱形图\'}, {\'label\' : \'热图\', \'value\' : \'热图\'}, {\'label\' : \'坐标轴\', \'value\' : \'坐标轴\'}, {\'label\' : \'图注\', \'value\' : \'图注\'}]}, {\'label\' : \'图片-2\', \'value\' : \'图片-2\', \'children\' : [{\'label\' : \'ROC-1\', \'value\' : \'ROC-1\'}, {\'label\' : \'ROC-2\', \'value\' : \'ROC-2\'}, {\'label\' : \'ROC-3\', \'value\' : \'ROC-3\'}, {\'label\' : \'ROC-4\', \'value\' : \'ROC-4\'}, {\'label\' : \'对角线\', \'value\' : \'对角线\'}, {\'label\' : \'箱形图\', \'value\' : \'箱形图\'}, {\'label\' : \'热图\', \'value\' : \'热图\'}, {\'label\' : \'坐标轴\', \'value\' : \'坐标轴\'}, {\'label\' : \'图注\', \'value\' : \'图注\'}]}, {\'label\' : \'图片-3\', \'value\' : \'图片-3\', \'children\' : [{\'label\' : \'ROC-1\', \'value\' : \'ROC-1\'}, {\'label\' : \'ROC-2\', \'value\' : \'ROC-2\'}, {\'label\' : \'ROC-3\', \'value\' : \'ROC-3\'}, {\'label\' : \'ROC-4\', \'value\' : \'ROC-4\'}, {\'label\' : \'对角线\', \'value\' : \'对角线\'}, {\'label\' : \'箱形图\', \'value\' : \'箱形图\'}, {\'label\' : \'热图\', \'value\' : \'热图\'}, {\'label\' : \'坐标轴\', \'value\' : \'坐标轴\'}, {\'label\' : \'图注\', \'value\' : \'图注\'}]}, {\'label\' : \'图片-4\', \'value\' : \'图片-4\', \'children\' : [{\'label\' : \'ROC-1\', \'value\' : \'ROC-1\'}, {\'label\' : \'ROC-2\', \'value\' : \'ROC-2\'}, {\'label\' : \'ROC-3\', \'value\' : \'ROC-3\'}, {\'label\' : \'ROC-4\', \'value\' : \'ROC-4\'}, {\'label\' : \'对角线\', \'value\' : \'对角线\'}, {\'label\' : \'箱形图\', \'value\' : \'箱形图\'}, {\'label\' : \'热图\', \'value\' : \'热图\'}, {\'label\' : \'坐标轴\', \'value\' : \'坐标轴\'}, {\'label\' : \'图注\', \'value\' : \'图注\'}]}]), fac.AntdText(id = \'current-ax\', keyboard = True, style = {\'font-size\': 18})], style = {\'display\': \'flex\', \'justifyContent\': \'center\', \'alignItems\': \'center\', \'height\': 200})]}, {\'title\' : \'步骤2\', \'subTitle\' : \'上传数据\', \'description\' : [fac.AntdDivider(children = \'上传数据\'), fac.AntdDraggerUpload(id = \'upload-raw-data\', apiUrl = \'/upload/\', fileMaxSize = 10, fileTypes = [\'csv\', \'xls\', \'xlsx\'], text = \'请上传csv, xls或xlsx文件\', hint = \'选择Axes对象后,点击或拖拽文件至此处进行上传。\', showUploadList = False, disabled = True), fac.AntdTable(id = \'upload-raw-data-table\')]}, {\'title\' : \'步骤3\', \'subTitle\' : \'计算统计量\', \'description\' : [fac.AntdDivider(children = \'计算统计量\'), fac.AntdSpace(children = [html.Div(children = [fac.AntdDivider(children = \'选择结局变量和自变量\', innerTextOrientation = \'left\')], style = {\'width\': 1000}), fac.AntdSelect(placeholder = \'选择结局变量(二分类因变量)\', id = \'outcome-variable\', style = {\'width\': 600}), fac.AntdTransfer(titles = [\'候选自变量\', \'选定自变量\'], showSearch = True, operations = [\'放入\', \'移出\'], id = \'independent-variable\', height = 600, style = {\'width\': 600}), fac.AntdSelect(id = \'fit-model\', placeholder = \'选择学习模型\', options = [{\'label\' : \'逻辑回归\', \'value\' : \'LogisticRegression\'}, {\'label\' : \'随机森林\', \'value\' : \'RandomForestClassifier\'}], style = {\'width\': 200}), fac.AntdButton(children = \'计算统计量\', id = \'calculate-statistics\', autoSpin = True, type = \'primary\', icon = [fac.AntdIcon(icon = \'md-layers\')]), html.Div(children = [fac.AntdDivider(children = \'计算结果\', innerTextOrientation = \'left\')], style = {\'width\': 1000}), html.Div(id = \'calculated-statistical-result\', children = [])], direction = \'vertical\', style = {\'display\': \'flex\', \'justifyContent\': \'center\', \'alignItems\': \'center\'})]}, {\'title\' : \'步骤4\', \'subTitle\' : \'设定图层参数\', \'description\' : [fac.AntdDivider(children = \'图层参数\'), fac.AntdSpace(children = [fac.AntdSpace(children = [html.Div(children = [fac.AntdDivider(children = \'图片格式\', innerTextOrientation = \'left\')], style = {\'width\': 1000}), fac.AntdSelect(id = {\'type\': \'update-plot-params-value\', \'index\': \'theme-style\'}, options = generate_attr_dict_from_str_list( str_list = plt.style.available, dict_keys = [\'label\', \'value\']), placeholder = \'选择主题\', style = {\'width\': 300})], direction = \'vertical\'), fac.AntdSpace(id = \'roc-ax-params\', style = {\'display\': \'none\'}, children = [html.Div(children = [fac.AntdDivider(children = \'ROC图层参数\', innerTextOrientation = \'left\')], style = {\'width\': 1000}), fac.AntdSpace(children = [fac.AntdText(children = \'颜色\', keyboard = True, style = {\'font-size\': 18}), fac.AntdButton(id = {\'type\': \'open-color-palette\', \'index\': \'roc\'}, children = \'调色板\', type = \'primary\', icon = [fac.AntdIcon(icon = \'md-layers\')]), fac.AntdModal(id = {\'type\': \'custom-color-picker\', \'index\': \'roc\'}, children = [fac.AntdSpace(children = [fuc.FefferyWheelColorPicker(id = {\'type\': \'color-wheel-selector\', \'index\': \'roc\'}), html.Div(id = {\'type\': \'wheel-color-div\', \'index\': \'roc\'}, style = {\'width\': \'200px\', \'height\': \'200px\', \'display\': \'flex\', \'alignItems\': \'center\', \'justifyContent\': \'center\', "borderRadius\'": \'5px\', \'boxShadow\': \'0px 0px 12px rgba(0, 0, 0, .12)\', \'transition\': \'0.25s\', \'backround\': \'#fffc51\'}), fuc.FefferyTwitterColorPicker(id = {\'type\': \'color-twitter-selector\', \'index\': \'roc\'}, colors = [\'#fff4ce\', \'#797673\', \'#fed9cc\', \'#d83b01\', \'#fde7e9\', \'#a80000\', \'#dff6dd\', \'#107c10\'])])], title = \'选择自定义颜色\', renderFooter = True, width = 800), fac.AntdSelect(id = {\'type\': \'custom-color-selector\', \'index\': \'roc\'}, defaultValue = \'#1864ab\', options = [{\'label\' : \'自定义色\', \'value\' : \'#1864ab\', \'colors\' : [\'#1864ab\']}], colorsMode = \'diverging\', disabled = False, style = {\'width\': 200}), fac.AntdSelect(defaultValue = \'配色1\', options = [{\'label\' : \'配色1\', \'value\' : \'配色1\', \'colors\' : [\'#fff5f5\', \'#ff8787\', \'#c92a2a\']}, {\'label\' : \'配色2\', \'value\' : \'配色2\', \'colors\' : [\'#f8f0fc\', \'#da77f2\', \'#862e9c\']}, {\'label\' : \'配色3\', \'value\' : \'配色3\', \'colors\' : [\'#e7f5ff\', \'#4dabf7\', \'#1864ab\']}], colorsMode = \'diverging\', style = {\'width\': 200}), fac.AntdSelect(defaultValue = \'RGB1\', options = [{\'group\' : \'RGB\', \'options\' : [{\'label\' : \'颜色1\', \'value\' : \'RGB1\', \'colors\' : [\'#fff5f5\']}, {\'label\' : \'颜色2\', \'value\' : \'RGB2\', \'colors\' : [\'#ff8787\']}, {\'label\' : \'颜色3\', \'value\' : \'RGB3\', \'colors\' : [\'#c92a2a\']}]}, {\'group\' : \'HEX\', \'options\' : [{\'label\' : \'颜色1\', \'value\' : \'HEX1\', \'colors\' : [\'#f8f0fc\']}, {\'label\' : \'颜色2\', \'value\' : \'HEX2\', \'colors\' : [\'#da77f2\']}, {\'label\' : \'颜色3\', \'value\' : \'HEX3\', \'colors\' : [\'#862e9c\']}]}], colorsMode = \'diverging\', style = {\'width\': 200})]), fac.AntdSpace(children = [fac.AntdText(children = \'曲线平滑度\', keyboard = True, style = {\'font-size\': 18, \'marginTop\': \'10px\'}), fac.AntdCheckbox(id = {\'type\': \'update-plot-params-check\', \'index\': \'smooth-line\'}, label = \'平滑\', style = {\'marginTop\': \'10px\'})]), fac.AntdSpace(children = [fac.AntdText(children = \'线条样式\', keyboard = True, style = {\'font-size\': 18}), fac.AntdInputNumber(max = 5, defaultValue = 1, id = {\'type\': \'update-plot-params-value\', \'index\': \'line-width-roc\'}, addonBefore = \'线条粗细\', prefix = [fac.AntdIcon(icon = \'antd-control\')], style = {\'marginTop\': \'10px\'})])], direction = \'vertical\'), fac.AntdSpace(id = \'diagonal-ax-params\', style = {\'display\': \'none\'}, children = [html.Div(children = [fac.AntdDivider(children = \'对角线图层参数\', innerTextOrientation = \'left\')], style = {\'width\': 1000}), fac.AntdSpace(children = [fac.AntdText(children = \'颜色\', keyboard = True, style = {\'font-size\': 18}), fac.AntdButton(id = {\'type\': \'open-color-palette\', \'index\': \'diagonal\'}, children = \'调色板\', type = \'primary\', icon = [fac.AntdIcon(icon = \'md-layers\')]), fac.AntdModal(id = {\'type\': \'custom-color-picker\', \'index\': \'diagonal\'}, children = [fac.AntdSpace(children = [fuc.FefferyWheelColorPicker(id = {\'type\': \'color-wheel-selector\', \'index\': \'diagonal\'}), html.Div(id = {\'type\': \'wheel-color-div\', \'index\': \'diagonal\'}, style = {\'width\': \'200px\', \'height\': \'200px\', \'display\': \'flex\', \'alignItems\': \'center\', \'justifyContent\': \'center\', "borderRadius\'": \'5px\', \'boxShadow\': \'0px 0px 12px rgba(0, 0, 0, .12)\', \'transition\': \'0.25s\', \'backround\': \'#fffc51\'}), fuc.FefferyTwitterColorPicker(id = {\'type\': \'color-twitter-selector\', \'index\': \'diagonal\'}, colors = [\'#fff4ce\', \'#797673\', \'#fed9cc\', \'#d83b01\', \'#fde7e9\', \'#a80000\', \'#dff6dd\', \'#107c10\'])])], title = \'选择自定义颜色\', renderFooter = True, width = 800), fac.AntdSelect(id = {\'type\': \'custom-color-selector\', \'index\': \'diagonal\'}, defaultValue = \'#1864ab\', options = [{\'label\' : \'自定义色\', \'value\' : \'#1864ab\', \'colors\' : [\'#1864ab\']}], colorsMode = \'diverging\', disabled = False, style = {\'width\': 200}), fac.AntdSelect(defaultValue = \'配色1\', options = [{\'label\' : \'配色1\', \'value\' : \'配色1\', \'colors\' : [\'#fff5f5\', \'#ff8787\', \'#c92a2a\']}, {\'label\' : \'配色2\', \'value\' : \'配色2\', \'colors\' : [\'#f8f0fc\', \'#da77f2\', \'#862e9c\']}, {\'label\' : \'配色3\', \'value\' : \'配色3\', \'colors\' : [\'#e7f5ff\', \'#4dabf7\', \'#1864ab\']}], colorsMode = \'diverging\', style = {\'width\': 200}), fac.AntdSelect(defaultValue = \'RGB1\', options = [{\'group\' : \'RGB\', \'options\' : [{\'label\' : \'颜色1\', \'value\' : \'RGB1\', \'colors\' : [\'#fff5f5\']}, {\'label\' : \'颜色2\', \'value\' : \'RGB2\', \'colors\' : [\'#ff8787\']}, {\'label\' : \'颜色3\', \'value\' : \'RGB3\', \'colors\' : [\'#c92a2a\']}]}, {\'group\' : \'HEX\', \'options\' : [{\'label\' : \'颜色1\', \'value\' : \'HEX1\', \'colors\' : [\'#f8f0fc\']}, {\'label\' : \'颜色2\', \'value\' : \'HEX2\', \'colors\' : [\'#da77f2\']}, {\'label\' : \'颜色3\', \'value\' : \'HEX3\', \'colors\' : [\'#862e9c\']}]}], colorsMode = \'diverging\', style = {\'width\': 200})]), fac.AntdSpace(children = [fac.AntdText(children = \'线条样式\', keyboard = True, style = {\'font-size\': 18}), fac.AntdInputNumber(id = {\'type\': \'update-plot-params-value\', \'index\': \'line-width-diagonal\'}, addonBefore = \'线条粗细\', prefix = [fac.AntdIcon(icon = \'antd-control\')], max = 5, defaultValue = 1, style = {\'marginTop\': \'10px\'})])], direction = \'vertical\')], direction = \'vertical\', style = {\'display\': \'flex\', \'justifyContent\': \'left\', \'alignItems\': \'center\'})]}, {\'title\' : \'步骤5\', \'subTitle\' : \'作图\', \'description\' : [fac.AntdDivider(children = \'作图\'), fac.AntdSpace(children = [html.Div(children = [fac.AntdDivider(children = \'选择图片布局\', innerTextOrientation = \'left\')], style = {\'width\': 1000}), fac.AntdCheckCardGroup(children = [fac.AntdCheckCard(children = \'1行1列\', value = \'1r1c\', size = \'small\'), fac.AntdCheckCard(children = \'1行2列\', value = \'1r2c\', size = \'small\'), fac.AntdCheckCard(children = \'2行1列\', value = \'2r1c\', size = \'small\'), fac.AntdCheckCard(children = \'2行2列\', value = \'2r2c\', size = \'small\')], defaultValue = \'1r1c\'), html.Div(children = [fac.AntdDivider(children = \'选择图层\', innerTextOrientation = \'left\')], style = {\'width\': 1000}), fac.AntdCascader(id = \'plot-axes-cascader\', placeholder = \'选择图层对象\', options = [{\'label\' : \'图片-1\', \'value\' : \'图片-1\', \'children\' : [{\'label\' : \'ROC-1\', \'value\' : \'ROC-1\'}, {\'label\' : \'ROC-2\', \'value\' : \'ROC-2\'}, {\'label\' : \'ROC-3\', \'value\' : \'ROC-3\'}, {\'label\' : \'ROC-4\', \'value\' : \'ROC-4\'}, {\'label\' : \'对角线\', \'value\' : \'对角线\'}, {\'label\' : \'箱形图\', \'value\' : \'箱形图\'}, {\'label\' : \'热图\', \'value\' : \'热图\'}, {\'label\' : \'坐标轴\', \'value\' : \'坐标轴\'}, {\'label\' : \'图注\', \'value\' : \'图注\'}]}, {\'label\' : \'图片-2\', \'value\' : \'图片-2\', \'children\' : [{\'label\' : \'ROC-1\', \'value\' : \'ROC-1\'}, {\'label\' : \'ROC-2\', \'value\' : \'ROC-2\'}, {\'label\' : \'ROC-3\', \'value\' : \'ROC-3\'}, {\'label\' : \'ROC-4\', \'value\' : \'ROC-4\'}, {\'label\' : \'对角线\', \'value\' : \'对角线\'}, {\'label\' : \'箱形图\', \'value\' : \'箱形图\'}, {\'label\' : \'热图\', \'value\' : \'热图\'}, {\'label\' : \'坐标轴\', \'value\' : \'坐标轴\'}, {\'label\' : \'图注\', \'value\' : \'图注\'}]}, {\'label\' : \'图片-3\', \'value\' : \'图片-3\', \'children\' : [{\'label\' : \'ROC-1\', \'value\' : \'ROC-1\'}, {\'label\' : \'ROC-2\', \'value\' : \'ROC-2\'}, {\'label\' : \'ROC-3\', \'value\' : \'ROC-3\'}, {\'label\' : \'ROC-4\', \'value\' : \'ROC-4\'}, {\'label\' : \'对角线\', \'value\' : \'对角线\'}, {\'label\' : \'箱形图\', \'value\' : \'箱形图\'}, {\'label\' : \'热图\', \'value\' : \'热图\'}, {\'label\' : \'坐标轴\', \'value\' : \'坐标轴\'}, {\'label\' : \'图注\', \'value\' : \'图注\'}]}, {\'label\' : \'图片-4\', \'value\' : \'图片-4\', \'children\' : [{\'label\' : \'ROC-1\', \'value\' : \'ROC-1\'}, {\'label\' : \'ROC-2\', \'value\' : \'ROC-2\'}, {\'label\' : \'ROC-3\', \'value\' : \'ROC-3\'}, {\'label\' : \'ROC-4\', \'value\' : \'ROC-4\'}, {\'label\' : \'对角线\', \'value\' : \'对角线\'}, {\'label\' : \'箱形图\', \'value\' : \'箱形图\'}, {\'label\' : \'热图\', \'value\' : \'热图\'}, {\'label\' : \'坐标轴\', \'value\' : \'坐标轴\'}, {\'label\' : \'图注\', \'value\' : \'图注\'}]}], multiple = True), fac.AntdButton(id = \'generate-plot\', children = \'生成图片\', type = \'primary\', icon = [fac.AntdIcon(icon = \'md-layers\')], style = {\'marginTop\': \'100px\'})], direction = \'vertical\', style = {\'display\': \'flex\', \'justifyContent\': \'left\', \'alignItems\': \'center\', \'height\': 400})]}, {\'title\' : \'步骤6\', \'subTitle\' : \'图片展示\', \'description\' : [fac.AntdDivider(children = \'画廊\'), fac.AntdSpace(children = [html.Div(children = [fac.AntdDivider(children = \'当前图片\', innerTextOrientation = \'left\')], style = {\'width\': 1000}), html.Div(children = [fac.AntdImage(id = \'statical-single-plot\', height = 600)]), html.Div(children = [fac.AntdDivider(children = \'历史图片\', innerTextOrientation = \'left\')], style = {\'width\': 1000}), html.Div(children = [fac.AntdImage(id = {\'type\': \'image\', \'index\': \'display-multiple-plots\'}, src = [], multiImageMode = \'unfold\', height = 160)])], direction = \'vertical\', style = {\'display\': \'flex\', \'justifyContent\': \'left\', \'alignItems\': \'center\'})]}], direction = \'vertical\', allowClick = True)',以`attr_name = attr_value`形式添加至组件列表

字典.attr_name='style', attr_value={'margin': '50px 50px 50px 50px'},不渲染attr_value,以`attr_name = attr_value`形式添加至组件列表

app.layout = html.Div(id = {'type': 'main-container-div', 'index': 'heihei'}, children = [html.Div(id = 'message-container'), fac.AntdSteps(steps = [{'title' : '步骤1', 'subTitle' : '选择图层', 'description' : [fac.AntdDivider(children = '图层'), fac.AntdSpace(children = [fac.AntdCascader(id = 'fig-axes-cascader', placeholder = '选择图层对象', expandTrigger = 'hover', options = [{'label' : '图片-1', 'value' : '图片-1', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}, {'label' : '图片-2', 'value' : '图片-2', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}, {'label' : '图片-3', 'value' : '图片-3', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}, {'label' : '图片-4', 'value' : '图片-4', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}]), fac.AntdText(id = 'current-ax', keyboard = True, style = {'font-size': 18})], style = {'display': 'flex', 'justifyContent': 'center', 'alignItems': 'center', 'height': 200})]}, {'title' : '步骤2', 'subTitle' : '上传数据', 'description' : [fac.AntdDivider(children = '上传数据'), fac.AntdDraggerUpload(id = 'upload-raw-data', apiUrl = '/upload/', fileMaxSize = 10, fileTypes = ['csv', 'xls', 'xlsx'], text = '请上传csv, xls或xlsx文件', hint = '选择Axes对象后,点击或拖拽文件至此处进行上传。', showUploadList = False, disabled = True), fac.AntdTable(id = 'upload-raw-data-table')]}, {'title' : '步骤3', 'subTitle' : '计算统计量', 'description' : [fac.AntdDivider(children = '计算统计量'), fac.AntdSpace(children = [html.Div(children = [fac.AntdDivider(children = '选择结局变量和自变量', innerTextOrientation = 'left')], style = {'width': 1000}), fac.AntdSelect(placeholder = '选择结局变量(二分类因变量)', id = 'outcome-variable', style = {'width': 600}), fac.AntdTransfer(titles = ['候选自变量', '选定自变量'], showSearch = True, operations = ['放入', '移出'], id = 'independent-variable', height = 600, style = {'width': 600}), fac.AntdSelect(id = 'fit-model', placeholder = '选择学习模型', options = [{'label' : '逻辑回归', 'value' : 'LogisticRegression'}, {'label' : '随机森林', 'value' : 'RandomForestClassifier'}], style = {'width': 200}), fac.AntdButton(children = '计算统计量', id = 'calculate-statistics', autoSpin = True, type = 'primary', icon = [fac.AntdIcon(icon = 'md-layers')]), html.Div(children = [fac.AntdDivider(children = '计算结果', innerTextOrientation = 'left')], style = {'width': 1000}), html.Div(id = 'calculated-statistical-result', children = [])], direction = 'vertical', style = {'display': 'flex', 'justifyContent': 'center', 'alignItems': 'center'})]}, {'title' : '步骤4', 'subTitle' : '设定图层参数', 'description' : [fac.AntdDivider(children = '图层参数'), fac.AntdSpace(children = [fac.AntdSpace(children = [html.Div(children = [fac.AntdDivider(children = '图片格式', innerTextOrientation = 'left')], style = {'width': 1000}), fac.AntdSelect(id = {'type': 'update-plot-params-value', 'index': 'theme-style'}, options = generate_attr_dict_from_str_list( str_list = plt.style.available, dict_keys = ['label', 'value']), placeholder = '选择主题', style = {'width': 300})], direction = 'vertical'), fac.AntdSpace(id = 'roc-ax-params', style = {'display': 'none'}, children = [html.Div(children = [fac.AntdDivider(children = 'ROC图层参数', innerTextOrientation = 'left')], style = {'width': 1000}), fac.AntdSpace(children = [fac.AntdText(children = '颜色', keyboard = True, style = {'font-size': 18}), fac.AntdButton(id = {'type': 'open-color-palette', 'index': 'roc'}, children = '调色板', type = 'primary', icon = [fac.AntdIcon(icon = 'md-layers')]), fac.AntdModal(id = {'type': 'custom-color-picker', 'index': 'roc'}, children = [fac.AntdSpace(children = [fuc.FefferyWheelColorPicker(id = {'type': 'color-wheel-selector', 'index': 'roc'}), html.Div(id = {'type': 'wheel-color-div', 'index': 'roc'}, style = {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}), fuc.FefferyTwitterColorPicker(id = {'type': 'color-twitter-selector', 'index': 'roc'}, colors = ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10'])])], title = '选择自定义颜色', renderFooter = True, width = 800), fac.AntdSelect(id = {'type': 'custom-color-selector', 'index': 'roc'}, defaultValue = '#1864ab', options = [{'label' : '自定义色', 'value' : '#1864ab', 'colors' : ['#1864ab']}], colorsMode = 'diverging', disabled = False, style = {'width': 200}), fac.AntdSelect(defaultValue = '配色1', options = [{'label' : '配色1', 'value' : '配色1', 'colors' : ['#fff5f5', '#ff8787', '#c92a2a']}, {'label' : '配色2', 'value' : '配色2', 'colors' : ['#f8f0fc', '#da77f2', '#862e9c']}, {'label' : '配色3', 'value' : '配色3', 'colors' : ['#e7f5ff', '#4dabf7', '#1864ab']}], colorsMode = 'diverging', style = {'width': 200}), fac.AntdSelect(defaultValue = 'RGB1', options = [{'group' : 'RGB', 'options' : [{'label' : '颜色1', 'value' : 'RGB1', 'colors' : ['#fff5f5']}, {'label' : '颜色2', 'value' : 'RGB2', 'colors' : ['#ff8787']}, {'label' : '颜色3', 'value' : 'RGB3', 'colors' : ['#c92a2a']}]}, {'group' : 'HEX', 'options' : [{'label' : '颜色1', 'value' : 'HEX1', 'colors' : ['#f8f0fc']}, {'label' : '颜色2', 'value' : 'HEX2', 'colors' : ['#da77f2']}, {'label' : '颜色3', 'value' : 'HEX3', 'colors' : ['#862e9c']}]}], colorsMode = 'diverging', style = {'width': 200})]), fac.AntdSpace(children = [fac.AntdText(children = '曲线平滑度', keyboard = True, style = {'font-size': 18, 'marginTop': '10px'}), fac.AntdCheckbox(id = {'type': 'update-plot-params-check', 'index': 'smooth-line'}, label = '平滑', style = {'marginTop': '10px'})]), fac.AntdSpace(children = [fac.AntdText(children = '线条样式', keyboard = True, style = {'font-size': 18}), fac.AntdInputNumber(max = 5, defaultValue = 1, id = {'type': 'update-plot-params-value', 'index': 'line-width-roc'}, addonBefore = '线条粗细', prefix = [fac.AntdIcon(icon = 'antd-control')], style = {'marginTop': '10px'})])], direction = 'vertical'), fac.AntdSpace(id = 'diagonal-ax-params', style = {'display': 'none'}, children = [html.Div(children = [fac.AntdDivider(children = '对角线图层参数', innerTextOrientation = 'left')], style = {'width': 1000}), fac.AntdSpace(children = [fac.AntdText(children = '颜色', keyboard = True, style = {'font-size': 18}), fac.AntdButton(id = {'type': 'open-color-palette', 'index': 'diagonal'}, children = '调色板', type = 'primary', icon = [fac.AntdIcon(icon = 'md-layers')]), fac.AntdModal(id = {'type': 'custom-color-picker', 'index': 'diagonal'}, children = [fac.AntdSpace(children = [fuc.FefferyWheelColorPicker(id = {'type': 'color-wheel-selector', 'index': 'diagonal'}), html.Div(id = {'type': 'wheel-color-div', 'index': 'diagonal'}, style = {'width': '200px', 'height': '200px', 'display': 'flex', 'alignItems': 'center', 'justifyContent': 'center', "borderRadius'": '5px', 'boxShadow': '0px 0px 12px rgba(0, 0, 0, .12)', 'transition': '0.25s', 'backround': '#fffc51'}), fuc.FefferyTwitterColorPicker(id = {'type': 'color-twitter-selector', 'index': 'diagonal'}, colors = ['#fff4ce', '#797673', '#fed9cc', '#d83b01', '#fde7e9', '#a80000', '#dff6dd', '#107c10'])])], title = '选择自定义颜色', renderFooter = True, width = 800), fac.AntdSelect(id = {'type': 'custom-color-selector', 'index': 'diagonal'}, defaultValue = '#1864ab', options = [{'label' : '自定义色', 'value' : '#1864ab', 'colors' : ['#1864ab']}], colorsMode = 'diverging', disabled = False, style = {'width': 200}), fac.AntdSelect(defaultValue = '配色1', options = [{'label' : '配色1', 'value' : '配色1', 'colors' : ['#fff5f5', '#ff8787', '#c92a2a']}, {'label' : '配色2', 'value' : '配色2', 'colors' : ['#f8f0fc', '#da77f2', '#862e9c']}, {'label' : '配色3', 'value' : '配色3', 'colors' : ['#e7f5ff', '#4dabf7', '#1864ab']}], colorsMode = 'diverging', style = {'width': 200}), fac.AntdSelect(defaultValue = 'RGB1', options = [{'group' : 'RGB', 'options' : [{'label' : '颜色1', 'value' : 'RGB1', 'colors' : ['#fff5f5']}, {'label' : '颜色2', 'value' : 'RGB2', 'colors' : ['#ff8787']}, {'label' : '颜色3', 'value' : 'RGB3', 'colors' : ['#c92a2a']}]}, {'group' : 'HEX', 'options' : [{'label' : '颜色1', 'value' : 'HEX1', 'colors' : ['#f8f0fc']}, {'label' : '颜色2', 'value' : 'HEX2', 'colors' : ['#da77f2']}, {'label' : '颜色3', 'value' : 'HEX3', 'colors' : ['#862e9c']}]}], colorsMode = 'diverging', style = {'width': 200})]), fac.AntdSpace(children = [fac.AntdText(children = '线条样式', keyboard = True, style = {'font-size': 18}), fac.AntdInputNumber(id = {'type': 'update-plot-params-value', 'index': 'line-width-diagonal'}, addonBefore = '线条粗细', prefix = [fac.AntdIcon(icon = 'antd-control')], max = 5, defaultValue = 1, style = {'marginTop': '10px'})])], direction = 'vertical')], direction = 'vertical', style = {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center'})]}, {'title' : '步骤5', 'subTitle' : '作图', 'description' : [fac.AntdDivider(children = '作图'), fac.AntdSpace(children = [html.Div(children = [fac.AntdDivider(children = '选择图片布局', innerTextOrientation = 'left')], style = {'width': 1000}), fac.AntdCheckCardGroup(children = [fac.AntdCheckCard(children = '1行1列', value = '1r1c', size = 'small'), fac.AntdCheckCard(children = '1行2列', value = '1r2c', size = 'small'), fac.AntdCheckCard(children = '2行1列', value = '2r1c', size = 'small'), fac.AntdCheckCard(children = '2行2列', value = '2r2c', size = 'small')], defaultValue = '1r1c'), html.Div(children = [fac.AntdDivider(children = '选择图层', innerTextOrientation = 'left')], style = {'width': 1000}), fac.AntdCascader(id = 'plot-axes-cascader', placeholder = '选择图层对象', options = [{'label' : '图片-1', 'value' : '图片-1', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}, {'label' : '图片-2', 'value' : '图片-2', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}, {'label' : '图片-3', 'value' : '图片-3', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}, {'label' : '图片-4', 'value' : '图片-4', 'children' : [{'label' : 'ROC-1', 'value' : 'ROC-1'}, {'label' : 'ROC-2', 'value' : 'ROC-2'}, {'label' : 'ROC-3', 'value' : 'ROC-3'}, {'label' : 'ROC-4', 'value' : 'ROC-4'}, {'label' : '对角线', 'value' : '对角线'}, {'label' : '箱形图', 'value' : '箱形图'}, {'label' : '热图', 'value' : '热图'}, {'label' : '坐标轴', 'value' : '坐标轴'}, {'label' : '图注', 'value' : '图注'}]}], multiple = True), fac.AntdButton(id = 'generate-plot', children = '生成图片', type = 'primary', icon = [fac.AntdIcon(icon = 'md-layers')], style = {'marginTop': '100px'})], direction = 'vertical', style = {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center', 'height': 400})]}, {'title' : '步骤6', 'subTitle' : '图片展示', 'description' : [fac.AntdDivider(children = '画廊'), fac.AntdSpace(children = [html.Div(children = [fac.AntdDivider(children = '当前图片', innerTextOrientation = 'left')], style = {'width': 1000}), html.Div(children = [fac.AntdImage(id = 'statical-single-plot', height = 600)]), html.Div(children = [fac.AntdDivider(children = '历史图片', innerTextOrientation = 'left')], style = {'width': 1000}), html.Div(children = [fac.AntdImage(id = {'type': 'image', 'index': 'display-multiple-plots'}, src = [], multiImageMode = 'unfold', height = 160)])], direction = 'vertical', style = {'display': 'flex', 'justifyContent': 'left', 'alignItems': 'center'})]}], direction = 'vertical', allowClick = True)], style = {'margin': '50px 50px 50px 50px'})

10.8.3.6 渲染app启动部分

# 渲染app启动部分
app_run_statements = yaml_data['app-run']


rendered_statement_app_run = []

for component_name, attributes in app_run_statements.items():
    # 如果 attributes是字符
    if isinstance(attributes, str):
        rendered_statement = f"{component_name} = {repr(attributes)}"
        
    else:
        rendered_attributes = {}
        for attr_name, attr_value in attributes.items():
            # print(f"\n\n{attr_name=}, {attr_value=}")
            if isinstance(attr_value, str) and attr_value.startswith('f('):   # attr_value是函数时
                function_name, args = attr_value.strip('f()').split(',', 1)
                attr_value_rendered =  f'{function_name}({args})'
                rendered_attributes[attr_name] = attr_value_rendered
            else:
                rendered_attributes[attr_name] = repr(attr_value)   # repr的功能是将attr_value加上引号

            
        rendered_statement = f"{component_name}({', '.join(f'{key} = {value}' for key, value in rendered_attributes.items())})"  # ' '.ljust(4)生成4个空格

        # 装饰器

        ## 增加非序列化行
        if component_name == "app.run":
            rendered_statement = f"if __name__ == '__main__':\n{' '.ljust(4)}{rendered_statement}"

        ## 删除值空字符串的属性性及等号,以还原为非序列化
        rendered_statement = rendered_statement.replace('= \'\'', '')
                
    rendered_statement_app_run.append(rendered_statement)

print('\n'.join(rendered_statement_app_run))
if __name__ == '__main__':
    app.run(debug = True, port = 8088)

10.8.3.7 渲染自定义函数(mytools)部分

# 定义一个函数来处理关键词参数转换

def convert_to_kwargs_string(kwargs_stament: dict):
    '''
    Example: 
    kwargs_stament: {'rule': '/upload/', 'methods': ['POST']}
    '''

    
    kwargs_string = ', '.join([f"{key} ={value}" if isinstance(value, list) or isinstance(value, bool) else f"{key} ='{value}'" for key, value in kwargs_stament.items()])

    kwargs_string_parts = []
    for key, value in kwargs_stament.items():
        if isinstance(value, str):
           value = repr(value)
        kwargs_string_parts.append(f"{key} ={value}")
        
    kwargs_string = ', '.join(kwargs_string_parts)

    
    return kwargs_string


mytools_statements = yaml_data["mytools"]
rendered_statement_mytools = []

for function_dict in mytools_statements:
    function_tag = f"# {function_dict.get('function-tag')}"

    # 函数的名称
    function_name = function_dict.get('function-name')
    
    ## 函数的位置参数
    function_args_string_list = function_dict.get('function-arguments').get('args')

    ## 函数的不定位置参数
    function_unlimited_args = function_dict.get('function-arguments').get('unlimited-args')
    function_unlimited_args_string = ''
    if function_unlimited_args:
        print(f"{function_unlimited_args=}")
        function_unlimited_args_string = f"*args"


    
    ## 函数的已定关键词参数
    function_kwargs = function_dict.get('function-arguments').get('kwargs')
    function_kwargs_string = ''
    if function_kwargs:
        print(f"{function_kwargs=}")
        function_kwargs_string = convert_to_kwargs_string(function_kwargs)
        
    # print(f"{function_kwargs_string=}")

    ## 函数的不定关键词参数
    function_unlimited_kwargs = function_dict.get('function-arguments').get('unlimited-kwargs')

    function_unlimited_kwargs_string = ''
    if function_unlimited_kwargs:
        print(f"{function_unlimited_kwargs=}")
        function_unlimited_kwargs_string = "**kwargs"
    

    ## 合并函数名称和参数

    function_all_args_list = [*function_args_string_list, function_kwargs_string, function_unlimited_kwargs_string]

    # 去除空值
    function_all_args_list = [function_args for function_args in  function_all_args_list if function_args]
    
    function_args_combined = ', '.join(function_all_args_list)
    function_title = f"def {function_name}({function_args_combined}):"

    # print(f"{function_title=}")

    function_body = "    " + function_dict.get('function-body').replace('\n', '\n    ')  # 函数体的缩进

    function_string = '\n'.join([function_tag, function_title, function_body])

    rendered_statement_mytools.append(function_string)

    # 合并依赖项
    dependencies = function_dict.get('dependencies', None)
    if dependencies:
        import_package_list.extend(dependencies)
    
    
print('\n'.join(rendered_statement_mytools))
function_kwargs={'path': '', 'path_value_dict': None}
function_kwargs={'current_path': '', 'paths': []}
function_kwargs={'json_data': None}
function_unlimited_kwargs=True
function_kwargs={'alpha': 0.95}
function_kwargs={'sample_weight': None}
# 由字符列表生成属性值字典,如AntdSelect的options,AntdTable的columns
def generate_attr_dict_from_str_list(str_list:list, dict_keys:list):
    key1, key2 = dict_keys
    attr_dict = [
        {key1: ele, key2: ele}
         for ele in str_list
    ]
    return attr_dict
    
# 将整个页面的部件的组织结构解析成路径和对应的值,并查找目标值的路径
def traverse_json_path_value(data, path ='', path_value_dict =None):
    if path_value_dict is None:
      path_value_dict = {'Path': [], 'Value': []}
    
    if isinstance(data, dict):
        for key, value in data.items():
            new_path = f"{path}.{key}" if path else key
            traverse_json_path_value(value, new_path, path_value_dict)
    elif isinstance(data, list):
        for index, item in enumerate(data):
            new_path = f"{path}[{index}]"
            traverse_json_path_value(item, new_path, path_value_dict)
    else:
        path_value_dict['Path'].append(path)
        path_value_dict['Value'].append(data)
    
    # 每个循环均保存,会导致速度减慢
    
    # pd.DataFrame(path_value_dict).to_csv('static/session/path_value_dict.csv', index = False)
    
    return pd.DataFrame(path_value_dict)
    
# 递归地查找JSON对象中指定键名的所有路径
def find_paths(json_obj, target_key, current_path ='', paths =[]):
    if isinstance(json_obj, dict):
        for key, value in json_obj.items():
            if key == target_key:
                paths.append((current_path + '.' + key).strip('.'))
            if isinstance(value, dict) or isinstance(value, list):
                find_paths(value, target_key, current_path + '.' + key, paths)
    elif isinstance(json_obj, list):
        for index, value in enumerate(json_obj):
            find_paths(value, target_key, current_path + '.' + str(index), paths)
    return paths
    
# 将路径列表转换为级联选项时的中间函数,用于添加节点
def add_node(tree, path):
    current_node = tree
    for node in path:
        found = False
        for child in current_node['children']:
            if child['value'] == node:
                current_node = child
                found = True
                break
        if not found:
            new_node = {'value': node, 'label': node, 'children': []}
            current_node['children'].append(new_node)
            current_node = new_node
    
# 将路径转换为级联选项
def paths_to_options(paths):
    options = []
    for path in paths:
        nodes = path.split('.')
        if not options:
            options.append({'value': nodes[0], 'label': nodes[0], 'children': []})
        else:
            add_node(options[0], nodes)
    return options
    
# 查找键名,并将查找到的路径转换为级联选项的高阶函数
def find_json_key_paths_to_cascader_options(json_data, target_key):
    json_paths = find_paths(json_data, target_key)
    if json_paths:
      cascader_options = paths_to_options(json_paths)
    else:
      cascader_options = []
    return cascader_options
    
# 按json路径取值,若没有则返回None
def get_json_value(json_data, path):
    keys = path.split('.')
    value = json_data
    for key in keys:
        if isinstance(value, dict) and key in value:
            value = value[key]
        else:
            return None
    return value
    
# 按json路径赋值,若没有则新建
def set_json_value(json_data, path, value):
    keys = path.split('.')
    current = json_data
    for key in keys[:-1]:
        if key not in current:
            current[key] = {}
        current = current[key]
    current[keys[-1]] = value
    
# 提取值为0或1的列,作为结局变量
def extract_binary_columns(df):
    binary_columns = []
    for column in df.columns:
        if df[column].dtype == 'int64' or df[column].dtype == 'float64':
            if df[column].dropna().isin([0, 1]).all():
                binary_columns.append(column)
    return binary_columns
    
# 将回调数据字典写入服务端json文件,如果文件已存在则更新后写入
def json_io(io, json_data =None):
    json_file = 'static/dict/plot-params.json'
    if io == 'w': 
      with open(json_file, "w", encoding = 'utf8') as jf:
        json.dump(json_data, jf, ensure_ascii = False, indent = 4)
    else:
      with open(json_file, "r", encoding = 'utf8') as jf:
        json_data = json.load(jf)
        return json_data
    
# 获取roc相关的统计数据,如每个观测值对应的sens, seps,以及auc,ci等
def calculate_roc_stat(json_data, model, df, response:str, independence:list, **kwargs):
    y_train = df[response]
    X_train = df[independence]
    
    # 模型拟合
    model.fit(X_train, y_train)
    ## 计算每个阈值的fpr和tpr
    probs = model.predict_proba(X_train) # 这里应该是X_test,由于没有测试集,用X_train代替验证
    preds = probs[:,1]  # 预测的probabilty
    fpr, tpr, threshold = metrics.roc_curve(y_train, preds)
    
    
    ## 计算auc
    roc_auc = metrics.auc(fpr, tpr)
    auc, auc_cov, ci = calculate_auc_ci(y_train, preds)
    
    return fpr, tpr, threshold, auc, auc_cov, ci
    
# 根据作图参数的json生成图片
def smart_plot_from_params_json(params_json):
    # 获取参数
    
    fig_axes_path = get_json_value(params_json, 'plot-fig-axes-path')
    current_fig_path = get_json_value(params_json, 'current-fig')
    theme_style = get_json_value(params_json, f'{current_fig_path}.theme-style')
    if not theme_style:
      theme_style = 'default'
    
    # 重置样式
    plt.rcdefaults()
    plt.style.use(theme_style)
    
    
    fig, ax = plt.subplots()
    
    for ax_path in fig_axes_path:
      ## roc
      if 'roc' in ax_path.lower():
        x_y_csv = get_json_value(params_json, f'{ax_path}.data-params.x-y-csv')
        df = pd.read_csv(x_y_csv)
    
        # 是否平滑曲线
        smooth = get_json_value(params_json, f'{ax_path}.plot-params.args.smooth')
        if smooth:
          df = df.rolling(window=2).mean().fillna(0)
    
    
        fpr = df.iloc[:, 0].values
        tpr = df.iloc[:, 1].values
        args = [fpr, tpr]
        kwargs = get_json_value(params_json, f'{ax_path}.plot-params.kwargs')
        ax.plot(*args, **kwargs)
    
      ## 对角线
      if '对角线' in ax_path.lower():
        kwargs = get_json_value(params_json, f'{ax_path}.plot-params.kwargs')
        ax.plot([0, 1], [0, 1], **kwargs)
    
    ## 保存图片
    img_save_path = f"static/session/{str(uuid4())}.jpeg"
    fig.savefig(img_save_path, dpi = 600)
    
    plt.close()
    
    ## 将图片路径保存至params_json
    params_json = json_io('r')
    set_json_value(params_json, f"{current_fig_path}.img-save-path", img_save_path)
    json_io('w', params_json)
    
    
    return img_save_path
    
# 计算auc及其方差和ci
def calculate_auc_ci(y_true, y_pred, alpha =0.95):
    auc, auc_cov = delong_roc_variance(y_true, y_pred)
    
    auc_std = np.sqrt(auc_cov)
    lower_upper_q = np.abs(np.array([0, 1]) - (1 - alpha) / 2)
    ci = stats.norm.ppf(
        lower_upper_q,
        loc=auc,
        scale=auc_std)
    
    ci[ci > 1] = 1
    ci[ci < 0] = 0
    return auc, auc_cov, ci
    
# Computes ROC AUC variance for a single set of predictions
def delong_roc_variance(ground_truth, predictions, sample_weight =None):
    order, label_1_count, ordered_sample_weight = compute_ground_truth_statistics(
      ground_truth, sample_weight)
    predictions_sorted_transposed = predictions[np.newaxis, order]
    aucs, delongcov = fastDeLong(predictions_sorted_transposed, label_1_count, ordered_sample_weight)
    assert len(aucs) == 1, "There is a bug in the code, please forward this to the developers"
    return aucs[0], delongcov
    
# 计算ground_truth_statistics,具体是什么,暂不清楚
def compute_ground_truth_statistics(ground_truth, sample_weight):
    assert np.array_equal(np.unique(ground_truth), [0, 1])
    order = (-ground_truth).argsort()
    label_1_count = int(ground_truth.sum())
    if sample_weight is None:
        ordered_sample_weight = None
    else:
        ordered_sample_weight = sample_weight[order]
    
    return order, label_1_count, ordered_sample_weight
    
# 计算auc的方差
def fastDeLong(predictions_sorted_transposed, label_1_count, sample_weight):
    if sample_weight is None:
        return fastDeLong_no_weights(predictions_sorted_transposed, label_1_count)
    else:
        return fastDeLong_weights(predictions_sorted_transposed, label_1_count, sample_weight)
    
# The fast version of DeLong's method for computing the covariance of unadjusted AUC.
def fastDeLong_weights(predictions_sorted_transposed, label_1_count, sample_weight):
    # Short variables are named as they are in the paper
    m = label_1_count
    n = predictions_sorted_transposed.shape[1] - m
    positive_examples = predictions_sorted_transposed[:, :m]
    negative_examples = predictions_sorted_transposed[:, m:]
    k = predictions_sorted_transposed.shape[0]
    
    tx = np.empty([k, m], dtype=float)
    ty = np.empty([k, n], dtype=float)
    tz = np.empty([k, m + n], dtype=float)
    for r in range(k):
        tx[r, :] = compute_midrank_weight(positive_examples[r, :], sample_weight[:m])
        ty[r, :] = compute_midrank_weight(negative_examples[r, :], sample_weight[m:])
        tz[r, :] = compute_midrank_weight(predictions_sorted_transposed[r, :], sample_weight)
    total_positive_weights = sample_weight[:m].sum()
    total_negative_weights = sample_weight[m:].sum()
    pair_weights = np.dot(sample_weight[:m, np.newaxis], sample_weight[np.newaxis, m:])
    total_pair_weights = pair_weights.sum()
    aucs = (sample_weight[:m]*(tz[:, :m] - tx)).sum(axis=1) / total_pair_weights
    v01 = (tz[:, :m] - tx[:, :]) / total_negative_weights
    v10 = 1. - (tz[:, m:] - ty[:, :]) / total_positive_weights
    sx = np.cov(v01)
    sy = np.cov(v10)
    delongcov = sx / m + sy / n
    return aucs, delongcov
    
# The fast version of DeLong's method for computing the covariance of unadjusted AUC, without weights.
def fastDeLong_no_weights(predictions_sorted_transposed, label_1_count):
    # Short variables are named as they are in the paper
    m = label_1_count
    n = predictions_sorted_transposed.shape[1] - m
    positive_examples = predictions_sorted_transposed[:, :m]
    negative_examples = predictions_sorted_transposed[:, m:]
    k = predictions_sorted_transposed.shape[0]
    
    tx = np.empty([k, m], dtype=float)
    ty = np.empty([k, n], dtype=float)
    tz = np.empty([k, m + n], dtype=float)
    for r in range(k):
        tx[r, :] = compute_midrank(positive_examples[r, :])
        ty[r, :] = compute_midrank(negative_examples[r, :])
        tz[r, :] = compute_midrank(predictions_sorted_transposed[r, :])
    aucs = tz[:, :m].sum(axis=1) / m / n - float(m + 1.0) / 2.0 / n
    v01 = (tz[:, :m] - tx[:, :]) / n
    v10 = 1.0 - (tz[:, m:] - ty[:, :]) / m
    sx = np.cov(v01)
    sy = np.cov(v10)
    delongcov = sx / m + sy / n
    return aucs, delongcov
    
# Computes midranks. AUC comparison adapted from https://github.com/Netflix/vmaf/
def compute_midrank(x):
    J = np.argsort(x)
    Z = x[J]
    N = len(x)
    T = np.zeros(N, dtype=float)
    i = 0
    while i < N:
        j = i
        while j < N and Z[j] == Z[i]:
            j += 1
        T[i:j] = 0.5*(i + j - 1)
        i = j
    T2 = np.empty(N, dtype=float)
    # Note(kazeevn) +1 is due to Python using 0-based indexing
    # instead of 1-based in the AUC formula in the paper
    T2[J] = T + 1
    return T2
    
# Computes midranks. AUC comparison adapted from https://github.com/Netflix/vmaf/
def compute_midrank_weight(x, sample_weight):
    J = np.argsort(x)
    Z = x[J]
    cumulative_weight = np.cumsum(sample_weight[J])
    N = len(x)
    T = np.zeros(N, dtype=float)
    i = 0
    while i < N:
        j = i
        while j < N and Z[j] == Z[i]:
            j += 1
        T[i:j] = cumulative_weight[i:j].mean()
        i = j
    T2 = np.empty(N, dtype=float)
    T2[J] = T
    return T2
    
mytools_statements 
[{'function-tag': '由字符列表生成属性值字典,如AntdSelect的options,AntdTable的columns',
  'function-name': 'generate_attr_dict_from_str_list',
  'function-arguments': {'args': ['str_list:list', 'dict_keys:list']},
  'function-body': 'key1, key2 = dict_keys\nattr_dict = [\n    {key1: ele, key2: ele}\n     for ele in str_list\n]\nreturn attr_dict\n'},
 {'function-tag': '将整个页面的部件的组织结构解析成路径和对应的值,并查找目标值的路径',
  'function-name': 'traverse_json_path_value',
  'function-arguments': {'args': ['data'],
   'kwargs': {'path': '', 'path_value_dict': None}},
  'dependencies': ['pandas@pd', 'json'],
  'function-body': 'if path_value_dict is None:\n  path_value_dict = {\'Path\': [], \'Value\': []}\n\nif isinstance(data, dict):\n    for key, value in data.items():\n        new_path = f"{path}.{key}" if path else key\n        traverse_json_path_value(value, new_path, path_value_dict)\nelif isinstance(data, list):\n    for index, item in enumerate(data):\n        new_path = f"{path}[{index}]"\n        traverse_json_path_value(item, new_path, path_value_dict)\nelse:\n    path_value_dict[\'Path\'].append(path)\n    path_value_dict[\'Value\'].append(data)\n\n# 每个循环均保存,会导致速度减慢\n\n# pd.DataFrame(path_value_dict).to_csv(\'static/session/path_value_dict.csv\', index = False)\n\nreturn pd.DataFrame(path_value_dict)\n'},
 {'function-tag': '递归地查找JSON对象中指定键名的所有路径',
  'function-name': 'find_paths',
  'function-arguments': {'args': ['json_obj', 'target_key'],
   'kwargs': {'current_path': '', 'paths': []}},
  'returns': '所有找到的路径列表',
  'function-body': "if isinstance(json_obj, dict):\n    for key, value in json_obj.items():\n        if key == target_key:\n            paths.append((current_path + '.' + key).strip('.'))\n        if isinstance(value, dict) or isinstance(value, list):\n            find_paths(value, target_key, current_path + '.' + key, paths)\nelif isinstance(json_obj, list):\n    for index, value in enumerate(json_obj):\n        find_paths(value, target_key, current_path + '.' + str(index), paths)\nreturn paths\n"},
 {'function-tag': '将路径列表转换为级联选项时的中间函数,用于添加节点',
  'function-name': 'add_node',
  'function-arguments': {'args': ['tree', 'path']},
  'returns': '无返回值',
  'function-body': "current_node = tree\nfor node in path:\n    found = False\n    for child in current_node['children']:\n        if child['value'] == node:\n            current_node = child\n            found = True\n            break\n    if not found:\n        new_node = {'value': node, 'label': node, 'children': []}\n        current_node['children'].append(new_node)\n        current_node = new_node\n"},
 {'function-tag': '将路径转换为级联选项',
  'function-name': 'paths_to_options',
  'function-arguments': {'args': ['paths']},
  'function-body': "options = []\nfor path in paths:\n    nodes = path.split('.')\n    if not options:\n        options.append({'value': nodes[0], 'label': nodes[0], 'children': []})\n    else:\n        add_node(options[0], nodes)\nreturn options\n"},
 {'function-tag': '查找键名,并将查找到的路径转换为级联选项的高阶函数',
  'function-name': 'find_json_key_paths_to_cascader_options',
  'function-arguments': {'args': ['json_data', 'target_key']},
  'function-body': 'json_paths = find_paths(json_data, target_key)\nif json_paths:\n  cascader_options = paths_to_options(json_paths)\nelse:\n  cascader_options = []\nreturn cascader_options\n'},
 {'function-tag': '按json路径取值,若没有则返回None',
  'function-name': 'get_json_value',
  'function-arguments': {'args': ['json_data', 'path']},
  'function-body': "keys = path.split('.')\nvalue = json_data\nfor key in keys:\n    if isinstance(value, dict) and key in value:\n        value = value[key]\n    else:\n        return None\nreturn value\n"},
 {'function-tag': '按json路径赋值,若没有则新建',
  'function-name': 'set_json_value',
  'function-arguments': {'args': ['json_data', 'path', 'value']},
  'returns': '没有返回值,直接使用方法即可',
  'function-body': "keys = path.split('.')\ncurrent = json_data\nfor key in keys[:-1]:\n    if key not in current:\n        current[key] = {}\n    current = current[key]\ncurrent[keys[-1]] = value\n"},
 {'function-tag': '提取值为0或1的列,作为结局变量',
  'function-name': 'extract_binary_columns',
  'function-arguments': {'args': ['df']},
  'function-body': "binary_columns = []\nfor column in df.columns:\n    if df[column].dtype == 'int64' or df[column].dtype == 'float64':\n        if df[column].dropna().isin([0, 1]).all():\n            binary_columns.append(column)\nreturn binary_columns\n"},
 {'function-tag': '将回调数据字典写入服务端json文件,如果文件已存在则更新后写入',
  'function-name': 'json_io',
  'function-arguments': {'args': ['io'], 'kwargs': {'json_data': None}},
  'dependencies': ['json', 'os'],
  'function-body': 'json_file = \'static/dict/plot-params.json\'\nif io == \'w\': \n  with open(json_file, "w", encoding = \'utf8\') as jf:\n    json.dump(json_data, jf, ensure_ascii = False, indent = 4)\nelse:\n  with open(json_file, "r", encoding = \'utf8\') as jf:\n    json_data = json.load(jf)\n    return json_data\n'},
 {'function-tag': '获取roc相关的统计数据,如每个观测值对应的sens, seps,以及auc,ci等',
  'function-name': 'calculate_roc_stat',
  'function-arguments': {'args': ['json_data',
    'model',
    'df',
    'response:str',
    'independence:list'],
   'unlimited-kwargs': True},
  'returns': 'roc相关的一些招标',
  'dependencies': ['sklearn.metrics@metrics',
   'sklearn.linear_model|LogisticRegression'],
  'function-body': 'y_train = df[response]\nX_train = df[independence]\n\n# 模型拟合\nmodel.fit(X_train, y_train)\n## 计算每个阈值的fpr和tpr\nprobs = model.predict_proba(X_train) # 这里应该是X_test,由于没有测试集,用X_train代替验证\npreds = probs[:,1]  # 预测的probabilty\nfpr, tpr, threshold = metrics.roc_curve(y_train, preds)\n\n\n## 计算auc\nroc_auc = metrics.auc(fpr, tpr)\nauc, auc_cov, ci = calculate_auc_ci(y_train, preds)\n\nreturn fpr, tpr, threshold, auc, auc_cov, ci\n'},
 {'function-tag': '根据作图参数的json生成图片',
  'function-name': 'smart_plot_from_params_json',
  'function-arguments': {'args': ['params_json']},
  'returns': '图片的路径',
  'dependencies': ['matplotlib.pyplot@plt', 'uuid|uuid4', 'seaborn@sb'],
  'function-body': '# 获取参数\n\nfig_axes_path = get_json_value(params_json, \'plot-fig-axes-path\')\ncurrent_fig_path = get_json_value(params_json, \'current-fig\')\ntheme_style = get_json_value(params_json, f\'{current_fig_path}.theme-style\')\nif not theme_style:\n  theme_style = \'default\'\n\n# 重置样式\nplt.rcdefaults()\nplt.style.use(theme_style)\n\n\nfig, ax = plt.subplots()\n\nfor ax_path in fig_axes_path:\n  ## roc\n  if \'roc\' in ax_path.lower():\n    x_y_csv = get_json_value(params_json, f\'{ax_path}.data-params.x-y-csv\')\n    df = pd.read_csv(x_y_csv)\n\n    # 是否平滑曲线\n    smooth = get_json_value(params_json, f\'{ax_path}.plot-params.args.smooth\')\n    if smooth:\n      df = df.rolling(window=2).mean().fillna(0)\n\n\n    fpr = df.iloc[:, 0].values\n    tpr = df.iloc[:, 1].values\n    args = [fpr, tpr]\n    kwargs = get_json_value(params_json, f\'{ax_path}.plot-params.kwargs\')\n    ax.plot(*args, **kwargs)\n\n  ## 对角线\n  if \'对角线\' in ax_path.lower():\n    kwargs = get_json_value(params_json, f\'{ax_path}.plot-params.kwargs\')\n    ax.plot([0, 1], [0, 1], **kwargs)\n\n## 保存图片\nimg_save_path = f"static/session/{str(uuid4())}.jpeg"\nfig.savefig(img_save_path, dpi = 600)\n\nplt.close()\n\n## 将图片路径保存至params_json\nparams_json = json_io(\'r\')\nset_json_value(params_json, f"{current_fig_path}.img-save-path", img_save_path)\njson_io(\'w\', params_json)\n\n\nreturn img_save_path\n'},
 {'function-tag': '计算auc及其方差和ci',
  'function-name': 'calculate_auc_ci',
  'function-arguments': {'args': ['y_true', 'y_pred'],
   'kwargs': {'alpha': 0.95}},
  'dependencies': ['scipy|stats', 'numpy@np'],
  'function-body': 'auc, auc_cov = delong_roc_variance(y_true, y_pred)\n\nauc_std = np.sqrt(auc_cov)\nlower_upper_q = np.abs(np.array([0, 1]) - (1 - alpha) / 2)\nci = stats.norm.ppf(\n    lower_upper_q,\n    loc=auc,\n    scale=auc_std)\n\nci[ci > 1] = 1\nci[ci < 0] = 0\nreturn auc, auc_cov, ci\n'},
 {'function-tag': 'Computes ROC AUC variance for a single set of predictions',
  'function-name': 'delong_roc_variance',
  'function-arguments': {'args': ['ground_truth', 'predictions'],
   'kwargs': {'sample_weight': None}},
  'dependencies': ['numpy@np'],
  'function-body': 'order, label_1_count, ordered_sample_weight = compute_ground_truth_statistics(\n  ground_truth, sample_weight)\npredictions_sorted_transposed = predictions[np.newaxis, order]\naucs, delongcov = fastDeLong(predictions_sorted_transposed, label_1_count, ordered_sample_weight)\nassert len(aucs) == 1, "There is a bug in the code, please forward this to the developers"\nreturn aucs[0], delongcov\n'},
 {'function-tag': '计算ground_truth_statistics,具体是什么,暂不清楚',
  'function-name': 'compute_ground_truth_statistics',
  'function-arguments': {'args': ['ground_truth', 'sample_weight']},
  'function-body': 'assert np.array_equal(np.unique(ground_truth), [0, 1])\norder = (-ground_truth).argsort()\nlabel_1_count = int(ground_truth.sum())\nif sample_weight is None:\n    ordered_sample_weight = None\nelse:\n    ordered_sample_weight = sample_weight[order]\n\nreturn order, label_1_count, ordered_sample_weight\n'},
 {'function-tag': '计算auc的方差',
  'function-name': 'fastDeLong',
  'function-arguments': {'args': ['predictions_sorted_transposed',
    'label_1_count',
    'sample_weight']},
  'function-body': 'if sample_weight is None:\n    return fastDeLong_no_weights(predictions_sorted_transposed, label_1_count)\nelse:\n    return fastDeLong_weights(predictions_sorted_transposed, label_1_count, sample_weight)\n'},
 {'function-tag': "The fast version of DeLong's method for computing the covariance of unadjusted AUC.",
  'function-name': 'fastDeLong_weights',
  'function-arguments': {'args': ['predictions_sorted_transposed',
    'label_1_count',
    'sample_weight']},
  'returns': ['AUC value', 'DeLong covariance'],
  'reference': "@article{sun2014fast,\n  title={Fast Implementation of DeLong's Algorithm for\n        Comparing the Areas Under Correlated Receiver Oerating Characteristic Curves},\n  author={Xu Sun and Weichao Xu},\n  journal={IEEE Signal Processing Letters},\n  volume={21},\n  number={11},\n  pages={1389--1393},\n  year={2014},\n  publisher={IEEE}\n}\n",
  'function-body': '# Short variables are named as they are in the paper\nm = label_1_count\nn = predictions_sorted_transposed.shape[1] - m\npositive_examples = predictions_sorted_transposed[:, :m]\nnegative_examples = predictions_sorted_transposed[:, m:]\nk = predictions_sorted_transposed.shape[0]\n\ntx = np.empty([k, m], dtype=float)\nty = np.empty([k, n], dtype=float)\ntz = np.empty([k, m + n], dtype=float)\nfor r in range(k):\n    tx[r, :] = compute_midrank_weight(positive_examples[r, :], sample_weight[:m])\n    ty[r, :] = compute_midrank_weight(negative_examples[r, :], sample_weight[m:])\n    tz[r, :] = compute_midrank_weight(predictions_sorted_transposed[r, :], sample_weight)\ntotal_positive_weights = sample_weight[:m].sum()\ntotal_negative_weights = sample_weight[m:].sum()\npair_weights = np.dot(sample_weight[:m, np.newaxis], sample_weight[np.newaxis, m:])\ntotal_pair_weights = pair_weights.sum()\naucs = (sample_weight[:m]*(tz[:, :m] - tx)).sum(axis=1) / total_pair_weights\nv01 = (tz[:, :m] - tx[:, :]) / total_negative_weights\nv10 = 1. - (tz[:, m:] - ty[:, :]) / total_positive_weights\nsx = np.cov(v01)\nsy = np.cov(v10)\ndelongcov = sx / m + sy / n\nreturn aucs, delongcov\n'},
 {'function-tag': "The fast version of DeLong's method for computing the covariance of unadjusted AUC, without weights.",
  'function-name': 'fastDeLong_no_weights',
  'function-arguments': {'args': ['predictions_sorted_transposed',
    'label_1_count']},
  'returns': 'AUC value, DeLong covariance',
  'reference': "@article{sun2014fast,\n  title={Fast Implementation of DeLong's Algorithm for\n        Comparing the Areas Under Correlated Receiver Oerating Characteristic Curves},\n  author={Xu Sun and Weichao Xu},\n  journal={IEEE Signal Processing Letters},\n  volume={21},\n  number={11},\n  pages={1389--1393},\n  year={2014},\n  publisher={IEEE}\n}\n",
  'function-body': '# Short variables are named as they are in the paper\nm = label_1_count\nn = predictions_sorted_transposed.shape[1] - m\npositive_examples = predictions_sorted_transposed[:, :m]\nnegative_examples = predictions_sorted_transposed[:, m:]\nk = predictions_sorted_transposed.shape[0]\n\ntx = np.empty([k, m], dtype=float)\nty = np.empty([k, n], dtype=float)\ntz = np.empty([k, m + n], dtype=float)\nfor r in range(k):\n    tx[r, :] = compute_midrank(positive_examples[r, :])\n    ty[r, :] = compute_midrank(negative_examples[r, :])\n    tz[r, :] = compute_midrank(predictions_sorted_transposed[r, :])\naucs = tz[:, :m].sum(axis=1) / m / n - float(m + 1.0) / 2.0 / n\nv01 = (tz[:, :m] - tx[:, :]) / n\nv10 = 1.0 - (tz[:, m:] - ty[:, :]) / m\nsx = np.cov(v01)\nsy = np.cov(v10)\ndelongcov = sx / m + sy / n\nreturn aucs, delongcov\n'},
 {'function-tag': 'Computes midranks. AUC comparison adapted from https://github.com/Netflix/vmaf/',
  'function-name': 'compute_midrank',
  'function-arguments': {'args': ['x']},
  'returns': 'array of midranks',
  'function-body': 'J = np.argsort(x)\nZ = x[J]\nN = len(x)\nT = np.zeros(N, dtype=float)\ni = 0\nwhile i < N:\n    j = i\n    while j < N and Z[j] == Z[i]:\n        j += 1\n    T[i:j] = 0.5*(i + j - 1)\n    i = j\nT2 = np.empty(N, dtype=float)\n# Note(kazeevn) +1 is due to Python using 0-based indexing\n# instead of 1-based in the AUC formula in the paper\nT2[J] = T + 1\nreturn T2\n'},
 {'function-tag': 'Computes midranks. AUC comparison adapted from https://github.com/Netflix/vmaf/',
  'function-name': 'compute_midrank_weight',
  'function-arguments': {'args': ['x', 'sample_weight']},
  'returns': 'array of midranks',
  'function-body': 'J = np.argsort(x)\nZ = x[J]\ncumulative_weight = np.cumsum(sample_weight[J])\nN = len(x)\nT = np.zeros(N, dtype=float)\ni = 0\nwhile i < N:\n    j = i\n    while j < N and Z[j] == Z[i]:\n        j += 1\n    T[i:j] = cumulative_weight[i:j].mean()\n    i = j\nT2 = np.empty(N, dtype=float)\nT2[J] = T\nreturn T2\n'}]

10.8.3.8 渲染callback部分

# 定义函数转换Output, Input, State, Patch的特殊关键词参数(prop, id)
def convert_to_args_string(args_stament: dict):
    '''
    Example: 
    args_stament: {'Output': {'id': 'upload-data-table', 'prop': 'data', 'allow_duplicate': True}}
    '''
    # 从字典中提取所需的值
    args_type = list(args_stament.keys())[0]  # 获取args的类型,如Output
    args_id = args_stament[args_type]['id']

    print(f"从字典中提取的id:{args_id=}")

    args_prop = args_stament[args_type]['prop']
    
    # 构建关键字参数部分的字符串
    kwargs_list = [f"{key}={value}" for key, value in args_stament[args_type].items() if key not in ['id', 'prop']]
    kwargs_string = ', '.join(kwargs_list)

    # print(f"{kwargs_string=}")

    if not isinstance(args_id, dict): # 非字典时要加引号
        args_id = repr(args_id)
    
    # 构建字符串形式的输出

    if kwargs_string:
        args_string = f"{args_type}({args_id}, '{args_prop}', {kwargs_string})"
    else:
        args_string = f"{args_type}({args_id}, '{args_prop}')"


    if isinstance(args_id, dict) and args_id.get('index') in ['MATCH', 'ALL']: 
        args_string = re.sub(r"'index': '(MATCH|ALL)'", r"'index': \1", args_string) # 将'index': 'MATCH' 或 'index': 'ALL'替换成'index': MATCH 或 'index': ALL,即去掉引号

    return args_string



callback_statements = yaml_data["callback"]
rendered_statement_callback = []


for function_dict in callback_statements:

    function_tag = f"# {function_dict.get('function-tag')}"

    # 装饰器的名称
    decorator_name = f"@{function_dict.get('decorator').get('decorator-name')}"
    # 装饰器的参数

    ## 装饰器的位置参数
    decorator_args = function_dict.get('decorator').get('decorator-arguments').get('args')

    decorator_args_string_list = []
    if decorator_args:
        # print(f"{decorator_args=}")
        
        for arg in decorator_args:
            # print(f"{arg=}, {list(arg.keys()) = }")
            
            # 如果是Output等位置参数
            if list(arg.keys())[0] in ['Output', 'Input', 'State', 'Patch']: 
                arg_string = convert_to_args_string(arg)
                # print(f"{arg_string=}")
                decorator_args_string_list.append(arg_string)
            else:
                print(f"尚需处理不是Output等位置参数的代码")
    
        
    # print(f"{decorator_args_string_list=}")    

    ## 装饰器的关键词参数
    decorator_kwargs = function_dict.get('decorator').get('decorator-arguments').get('kwargs')
    decorator_kwargs_string = ''
    if decorator_kwargs:
        # print(f"{decorator_kwargs=}")
        decorator_kwargs_string = convert_to_kwargs_string(decorator_kwargs)
    # print(f"{decorator_kwargs_string=}")
        

    ## 合并装饰器名称和参数
    decorator_args_combined = ', '.join([*decorator_args_string_list, decorator_kwargs_string])
    decorator_title = f"{decorator_name}({decorator_args_combined})"

    # print(f"{decorator_title=}")

    # 函数的名称
    function_name = function_dict.get('function-name')
    
    ## 函数的位置参数
    function_args = function_dict.get('function-arguments').get('args')

    function_args_string_list = []
    if function_args:
        # print(f"{function_args=}")
        function_args_string_list = function_args
       
    ## 函数的关键词参数

    function_kwargs = function_dict.get('function-arguments').get('kwargs')
    function_kwargs_string = ''
    if function_kwargs:
        # print(f"{function_kwargs=}")
        function_kwargs_string = convert_to_kwargs_string(function_kwargs)
        
    # print(f"{function_kwargs_string=}")

    ## 合并函数名称和参数
    function_args_combined = ', '.join([*function_args_string_list, function_kwargs_string]).strip(', ')
    function_title = f"def {function_name}({function_args_combined}):"

    # print(f"{function_title=}")

    function_body = "    " + function_dict.get('function-body').replace('\n', '\n    ')  # 函数体的缩进

    function_string = '\n'.join([function_tag, decorator_title, function_title, function_body])

    rendered_statement_callback.append(function_string)

    # 合并依赖项
    dependencies = function_dict.get('dependencies', None)
    if dependencies:
        import_package_list.extend(dependencies)
    
    

print('\n'.join(rendered_statement_callback))
从字典中提取的id:args_id='current-ax'
从字典中提取的id:args_id='upload-raw-data'
从字典中提取的id:args_id='outcome-variable'
从字典中提取的id:args_id='independent-variable'
从字典中提取的id:args_id='independent-variable'
从字典中提取的id:args_id='plot-axes-cascader'
从字典中提取的id:args_id='roc-ax-params'
从字典中提取的id:args_id='diagonal-ax-params'
从字典中提取的id:args_id='fig-axes-cascader'
从字典中提取的id:args_id='upload-raw-data-table'
从字典中提取的id:args_id='upload-raw-data-table'
从字典中提取的id:args_id='outcome-variable'
从字典中提取的id:args_id='outcome-variable'
从字典中提取的id:args_id='upload-raw-data'
从字典中提取的id:args_id='independent-variable'
从字典中提取的id:args_id='independent-variable'
从字典中提取的id:args_id='outcome-variable'
从字典中提取的id:args_id='independent-variable'
从字典中提取的id:args_id='message-container'
从字典中提取的id:args_id='independent-variable'
从字典中提取的id:args_id='calculated-statistical-result'
从字典中提取的id:args_id='calculate-statistics'
从字典中提取的id:args_id='calculate-statistics'
从字典中提取的id:args_id='fit-model'
从字典中提取的id:args_id='statical-single-plot'
从字典中提取的id:args_id={'type': 'update-plot-params-value', 'index': 'theme-style'}
从字典中提取的id:args_id={'type': 'custom-color-picker', 'index': 'MATCH'}
从字典中提取的id:args_id={'type': 'open-color-palette', 'index': 'MATCH'}
从字典中提取的id:args_id={'type': 'custom-color-selector', 'index': 'MATCH'}
从字典中提取的id:args_id={'type': 'custom-color-selector', 'index': 'MATCH'}
从字典中提取的id:args_id={'type': 'wheel-color-div', 'index': 'MATCH'}
从字典中提取的id:args_id={'type': 'wheel-color-div', 'index': 'MATCH'}
从字典中提取的id:args_id={'type': 'color-wheel-selector', 'index': 'MATCH'}
从字典中提取的id:args_id={'type': 'color-twitter-selector', 'index': 'MATCH'}
从字典中提取的id:args_id={'type': 'custom-color-selector', 'index': 'MATCH'}
从字典中提取的id:args_id={'type': 'custom-color-selector', 'index': 'MATCH'}
从字典中提取的id:args_id={'type': 'wheel-color-div', 'index': 'MATCH'}
从字典中提取的id:args_id='message-container'
从字典中提取的id:args_id='plot-axes-cascader'
从字典中提取的id:args_id='statical-single-plot'
从字典中提取的id:args_id='message-container'
从字典中提取的id:args_id='generate-plot'
从字典中提取的id:args_id='statical-single-plot'
从字典中提取的id:args_id='message-container'
从字典中提取的id:args_id={'type': 'update-plot-params-check', 'index': 'ALL'}
从字典中提取的id:args_id={'type': 'custom-color-selector', 'index': 'ALL'}
从字典中提取的id:args_id={'type': 'update-plot-params-value', 'index': 'ALL'}
# 上传数据服务
@app.server.route(rule ='/upload/', methods =['POST'])
def upload_file(upload_dir ='static/upload', upload_backup_dir ='static/upload_backup'):
    # 获取上传id参数,用于指向保存路径
    uploadId = request.values.get('uploadId')
    
    
    # 获取上传的文件名称
    filename = request.files['file'].filename
    
    # 创建文件夹
    if not os.path.exists(f'{upload_dir}/{uploadId}'): # 同一个上传组件同一个会话的uploadId是一样的
        os.makedirs(f'{upload_dir}/{uploadId}')
    
    # 流式写出文件到指定目录
    filePath =f'{upload_dir}/{uploadId}/{filename}'
    
    if os.path.exists(filePath): # 如果存在的话则备份,防止被覆盖
    
        src_path = filePath
        dst_path = f'{upload_backup_dir}/{uuid4()}-{filename}'
        if not os.path.exists(dst_path):
            os.makedirs(dst_path)
    
    
        shutil.copy(src_path, dst_path)
    
    with open(filePath, 'wb') as f:
        # 流式写出大型文件,这里的10代表10MB
        for chunk in iter(lambda: request.files['file'].read(1024 * 1024 * 10), b''):
            f.write(chunk)
    return filePath
    
# 选择图层时
@callback(Output('current-ax', 'children'), Output('upload-raw-data', 'disabled', allow_duplicate=True), Output('outcome-variable', 'value', allow_duplicate=True), Output('independent-variable', 'dataSource', allow_duplicate=True), Output('independent-variable', 'targetKeys', allow_duplicate=True), Output('plot-axes-cascader', 'options', allow_duplicate=True), Output('roc-ax-params', 'style'), Output('diagonal-ax-params', 'style'), Input('fig-axes-cascader', 'value'), prevent_initial_call =True)
def show_current_ax(fig_axes_cascader_value):
    print("\n\n第一步:选择图层")
    print(f"{fig_axes_cascader_value=}")
    
    current_ax_children, upload_raw_data_disabled, \
    outcome_variable_value, independent_variable_datasource, independent_variable_targetkeys, \
    plot_axes_cascader_options = [dash.no_update] * 6
    
    roc_ax_params_style,  diagonal_ax_params_style = [{'display':'none'}] * 2
    
    params_json = json_io('r')
    
    if fig_axes_cascader_value:
      current_ax_children = " > ".join(fig_axes_cascader_value)
      params_json['current-fig'], params_json['current-ax'] = fig_axes_cascader_value
    else:
      current_ax_children = ''
    
    # 激活上传按钮
    upload_raw_data_disabled = False
    
    # 将当前图层的json_path保存至params-json
    
    params_json['current-ax-path'] = ".".join(fig_axes_cascader_value) if current_ax_children else ''
    
    
    json_io('w', params_json)
    
    
    
    
    # 显示相应图层参数的界面
    print(f"{current_ax_children=}")
    if "roc" in current_ax_children.lower():
      roc_ax_params_style = {'display':'block'}
    elif "对角线" in current_ax_children.lower():
      diagonal_ax_params_style = {'display':'block'}
    else:
      pass
    
    # 初始化结局变量的value和自变量的targetKeys
    outcome_variable_value = None
    independent_variable_datasource = []
    independent_variable_targetkeys = []
    
    return current_ax_children, upload_raw_data_disabled, \
    outcome_variable_value, independent_variable_datasource, independent_variable_targetkeys, \
    plot_axes_cascader_options, \
    roc_ax_params_style, diagonal_ax_params_style
    
# 上传文件时
@callback(Output('upload-raw-data-table', 'data'), Output('upload-raw-data-table', 'columns'), Output('outcome-variable', 'options', allow_duplicate=True), Output('outcome-variable', 'value', allow_duplicate=True), Input('upload-raw-data', 'lastUploadTaskRecord'), prevent_initial_call =True)
def manage_upload_raw_data(upload_raw_data_lastuploadtaskrecord):
    print("\n\n第二步:上传数据")
    
    upload_raw_data_table_data, upload_raw_data_table_columns, \
    outcome_variable_options, outcome_variable_value = [dash.no_update] * 4
    
    file_name = upload_raw_data_lastuploadtaskrecord['fileName']
    uploadfilePath = f"{upload_dir}/{upload_raw_data_lastuploadtaskrecord['taskId']}/{file_name}"
    if file_name.endswith('xlsx'):
      df = pd.read_excel(uploadfilePath, engine = 'openpyxl')
    elif file_name.endswith('xls') :
        df = pd.read_excel(uploadfilePath, engine = 'xlrd')
    elif file_name.endswith('csv'):
        df = pd.read_csv(uploadfilePath)
      
    upload_raw_data_table_data = df.to_dict('records')
    upload_raw_data_table_columns = generate_attr_dict_from_str_list(str_list = df.columns, dict_keys = ['title', 'dataIndex'])
    
    # 初始化结局变量的options
    ## 提取值为0,1这样的列
    binary_columns = extract_binary_columns(df)
    outcome_variable_options = generate_attr_dict_from_str_list(str_list = binary_columns, dict_keys = ['label', 'value'])
    
    
    
      
    # 初始化自变量的datasource
    independent_variable_datasource = generate_attr_dict_from_str_list(str_list = df.columns, dict_keys = ['key', 'title'])
    
    
    
    # 更新params-json
    params_json = json_io('r')
    current_ax_path = params_json['current-ax-path']
    set_json_value(params_json, f"{current_ax_path}.data-params.raw-data-file-path", uploadfilePath)
    set_json_value(params_json, f"{current_ax_path}.data-params.df-columns", list(df.columns))
    json_io('w', params_json)
    
    
    return upload_raw_data_table_data, upload_raw_data_table_columns, \
    outcome_variable_options, outcome_variable_value
    
# 选择结局变量时
@callback(Output('independent-variable', 'dataSource', allow_duplicate=True), Output('independent-variable', 'targetKeys', allow_duplicate=True), Input('outcome-variable', 'value'), State('independent-variable', 'targetKeys'), prevent_initial_call =True)
def select_outcome_variable(outcome_variable, independent_variable_targetkeys_state):
    print(f"\n选择结局变量")
    independent_variable_datasource, independent_variable_targetkeys = [dash.no_update] * 2
    
    
    params_json = json_io('r')
    if outcome_variable:
      set_json_value(params_json, f"{params_json['current-ax-path']}.data-params.outcome-variable", outcome_variable)
      df_columns = get_json_value(params_json, f"{params_json['current-ax-path']}.data-params.df-columns")
      # 更新自变量的dataSource
      independent_variable_datasource = [{'key': col, 'title': col} for col in df_columns if col != outcome_variable] 
    
    # 更新自变量的targetKeys
    if independent_variable_targetkeys_state:
      independent_variable_targetkeys = [targetkey for targetkey in independent_variable_targetkeys_state if targetkey != outcome_variable]
      set_json_value(params_json, f"{params_json['current-ax-path']}.data-params.independent-variable", independent_variable_targetkeys)
    
    
    json_io('w', params_json)
    
    return independent_variable_datasource, independent_variable_targetkeys
    
# 自变量穿梭时
@callback(Output('message-container', 'children', allow_duplicate=True), Input('independent-variable', 'targetKeys'), prevent_initial_call =True)
def select_outcome_variable(independent_variable):
    print(f"\n自变量穿梭")
    message_container_children = dash.no_update
    
    params_json = json_io('r')
    set_json_value(params_json, f"{params_json['current-ax-path']}.data-params.independent-variable", independent_variable)
    json_io('w', params_json)
    
# 计算统计量时
@callback(Output('calculated-statistical-result', 'children', allow_duplicate=True), Output('calculate-statistics', 'loading'), Input('calculate-statistics', 'nClicks'), State('fit-model', 'value'), prevent_initial_call =True)
def calculate_statitics(calculate_statistics_click, fit_model_name):
    calculated_statistical_result_children = dash.no_update
    
    if calculate_statistics_click:
      print(f"\n计算统计量")
      # 拟合模型
      model_dict = {
        'LogisticRegression' : LogisticRegression(),
        'RandomForestClassifier' : RandomForestClassifier()
      }
    
      model = model_dict.get(fit_model_name)
    
      ## 数据源
      params_json = json_io('r')
      data_file_json_path = f"{params_json['current-ax-path']}.data-params.raw-data-file-path"
      data_file = get_json_value(params_json, data_file_json_path)
      
      ## 读取数据,后期可包装成函数
      if data_file.endswith('xlsx'):
        df = pd.read_excel(data_file, engine = 'openpyxl')
      elif data_file.endswith('xls') :
          df = pd.read_excel(data_file, engine = 'xlrd')
      elif data_file.endswith('csv'):
          df = pd.read_csv(data_file)
    
      # 响应变量
      response = get_json_value(params_json, f"{params_json['current-ax-path']}.data-params.outcome-variable")
      
      # 自变量
      independence = get_json_value(params_json, f"{params_json['current-ax-path']}.data-params.independent-variable")
    
      # 计算相关roc数据
      fpr, tpr, threshold, auc, auc_cov, ci = calculate_roc_stat(params_json, model, df, response, independence)
    
      calculated_statistical_result_children = f"AUC={auc}, 95%CI={ci}"
    
    
      # 保存数据至csv
    
      x_y = pd.DataFrame({'fpr': fpr, 'tpr':tpr})
      x_y_csv= f'static/session/x-y_{str(uuid4())}.csv'
      x_y.to_csv(x_y_csv, index = False)
    
      auc_stat = pd.DataFrame({'auc': auc, 'auc_cov': auc_cov, 'ci': ci})
      auc_stat_csv = f'static/session/auc-stat_{str(uuid4())}.csv'
      auc_stat.to_csv(auc_stat_csv, index = False)
    
      params_json = json_io('r')
      set_json_value(params_json, f"{params_json['current-ax-path']}.data-params.x-y-csv", x_y_csv)
      set_json_value(params_json, f"{params_json['current-ax-path']}.data-params.auc-stat-csv", auc_stat_csv)
      json_io('w', params_json)
      
    
    calculate_statistics_loading = False
    
    return calculated_statistical_result_children, calculate_statistics_loading
    
# 选择样式
@callback(Output('statical-single-plot', 'src', allow_duplicate=True), Input({'type': 'update-plot-params-value', 'index': 'theme-style'}, 'value'), prevent_initial_call =True)
def select_theme_style(theme_style_value):
    print(f"选择样式时")
    
    statical_single_plot_src = dash.no_update
    
    params_json = json_io('r')
    
    set_json_value(params_json, f'{params_json['current-fig']}.theme-style', theme_style_value)
    
    json_io('w', params_json)
    
    return statical_single_plot_src
    
# 打开调色板
@callback(Output({'type': 'custom-color-picker', 'index': MATCH}, 'visible'), Input({'type': 'open-color-palette', 'index': MATCH}, 'nClicks'), prevent_initial_call =True)
def open_custom_color_palette(open_color_palette_button_click):
    print(f"打开调色板时")
    
    custom_color_picker_visible = dash.no_update
    custom_color_picker_visible = True
    
    
    return custom_color_picker_visible
    
# 调色板颜色回调至自定义色
@callback(Output({'type': 'custom-color-selector', 'index': MATCH}, 'value'), Output({'type': 'custom-color-selector', 'index': MATCH}, 'options'), Output({'type': 'wheel-color-div', 'index': MATCH}, 'style'), Output({'type': 'wheel-color-div', 'index': MATCH}, 'children'), Input({'type': 'color-wheel-selector', 'index': MATCH}, 'color'), Input({'type': 'color-twitter-selector', 'index': MATCH}, 'color'), Input({'type': 'custom-color-selector', 'index': MATCH}, 'value'), State({'type': 'custom-color-selector', 'index': MATCH}, 'options'), State({'type': 'wheel-color-div', 'index': MATCH}, 'style'), prevent_initial_call =True)
def select_custom_color(selected_wheel_color, selected_twitter_color, custom_color_selector_value_state, custom_color_selector_options_state, wheel_color_div_style_state):
    # @jhzac69867347
    # @lmixb53518435
    # @tanghuaxilie
    
    trigger = dash.callback_context.triggered
    print(f"\n\n{dash.callback_context.triggered=}")
    # print(f"{dash.callback_context.triggered_prop_ids=}")
    
    triggered_prop_id = dash.callback_context.triggered[0]['prop_id']
    
    print(f"\n\n{triggered_prop_id=}")
    
    custom_color_selector_value, custom_color_selector_options, wheel_color_div_style, \
    wheel_color_div_children  = [dash.no_update] * 4
    
    # wheel color
    if json.loads(triggered_prop_id.rsplit(".")[0])['type'] == "color-wheel-selector":
      print(f"\n\n选择转盘颜色")
      wheel_color = dash.callback_context.triggered[0]['value']
      
    
      # 构建新的颜色选择项
      custom_color_options_added = {
          'label': wheel_color,
          'value': wheel_color,
          'colors': [wheel_color]
      }
      
      # 颜色显示区
      wheel_color_div_children = wheel_color
    
      wheel_color_div_style_state['background'] = wheel_color
      wheel_color_div_style = wheel_color_div_style_state
    
      # 自定义颜色选择框
      if custom_color_options_added not in custom_color_selector_options_state: # 防止重复添加
        custom_color_selector_options = [custom_color_options_added, *custom_color_selector_options_state]
      custom_color_selector_value = wheel_color
    
      # 写入params_json
      params_json = json_io('r')
      set_json_value(params_json, f"{params_json['current-ax-path']}.plot-params.kwargs.color", wheel_color)
      json_io('w', params_json)
    
    
    elif json.loads(triggered_prop_id.rsplit(".")[0])['type'] == "color-twitter-selector":
      print(f"\n\n选择twitter颜色")
      twitter_color = dash.callback_context.triggered[0]['value']
      
    
      # 构建新的颜色选择项
      custom_color_options_added = {
          'label': twitter_color,
          'value': twitter_color,
          'colors': [twitter_color]
      }
    
     
      
      # 颜色显示区
      wheel_color_div_children = twitter_color
    
      wheel_color_div_style_state['background'] = twitter_color
      wheel_color_div_style = wheel_color_div_style_state
    
      # 自定义颜色选择框
      if custom_color_options_added not in custom_color_selector_options_state: # 防止重复添加
        custom_color_selector_options = [custom_color_options_added, *custom_color_selector_options_state]
      custom_color_selector_value = twitter_color
    
      # 写入params_json
      params_json = json_io('r')
      set_json_value(params_json, f"{params_json['current-ax-path']}.plot-params.kwargs.color", twitter_color)
      json_io('w', params_json)
    
    elif json.loads(triggered_prop_id.rsplit(".")[0])['type'] == "custom-color-selector":
      print(f"\n\n选择自定义颜色")
    
      # 写入params_json
      ## 由于wheel-color的自发性,导致有一个自发的回调,导致乱写入json文件,这时要控制有条件地写入
      params_json = json_io('r')
      if params_json.get('current-ax-path'): 
        set_json_value(params_json, f"{params_json['current-ax-path']}.plot-params.kwargs.color", custom_color_selector_value_state)
        json_io('w', params_json)
    
    
    return custom_color_selector_value, custom_color_selector_options, wheel_color_div_style, \
    wheel_color_div_children
    
# 选择作图图层
@callback(Output('message-container', 'children', allow_duplicate=True), Input('plot-axes-cascader', 'value'), prevent_initial_call =True)
def select_plot_fig_axes(plot_fig_axes_value):
    print("\n\n选择作图图层")
    message_container_children = dash.no_update
    if plot_fig_axes_value:
      print(f"{plot_fig_axes_value=}")
      plot_fig_axes_path = [".".join(plot_fig_ax) for plot_fig_ax in plot_fig_axes_value]
    
      # 写入params_json
      params_json = json_io('r')
      set_json_value(params_json, 'plot-fig-axes-path', plot_fig_axes_path)
      json_io('w', params_json)
    
    
    return message_container_children
    
# 作图
@callback(Output('statical-single-plot', 'src', allow_duplicate=True), Output('message-container', 'children', allow_duplicate=True), Input('generate-plot', 'nClicks'), prevent_initial_call =True)
def plot(generate_plot_click):
    print(f"\n\n开始作图")
    
    statical_single_plot_src, message_container_children = [dash.no_update] * 2
    
    params_json = json_io('r')
    
    if params_json['plot-fig-axes-path']: # 设置了作图路径才更新图片
      statical_single_plot_src = smart_plot_from_params_json(params_json)
    else:
      message_container_children = fac.AntdMessage(
        content='请选择作图图层',
        type='error'
      )
    
    
    return statical_single_plot_src, message_container_children
    
# 参数改变后,自动更新图
@callback(Output('statical-single-plot', 'src', allow_duplicate=True), Output('message-container', 'children', allow_duplicate=True), Input({'type': 'update-plot-params-check', 'index': ALL}, 'checked'), Input({'type': 'custom-color-selector', 'index': ALL}, 'value'), Input({'type': 'update-plot-params-value', 'index': ALL}, 'value'), prevent_initial_call =True)
def update_plot(update_plot_params_check, custom_selected_color, update_plot_params_value):
    trigger = dash.callback_context.triggered
    print(f"激活callback的对象为:{trigger=}")
    plot_param_prop_id = json.loads(trigger[0].get('prop_id').rsplit('.')[0])
    print(f"prop.id为:{plot_param_prop_id=}")
    
    
    statical_single_plot_src, message_container_children = [dash.no_update] * 2
    # 更新图片的样式
    if plot_param_prop_id == {'index': 'theme-style', 'type': 'update-plot-params-value'}:
      print(f"\n\n更新图片样式")
      updated_param = trigger[0]['value']
      params_json = json_io('r')
      set_json_value(params_json, f"{params_json['current-ax-path']}.theme-style", updated_param)
      json_io('w', params_json)
    
    # 更新ROC平滑参数
    if plot_param_prop_id == {'index': 'smooth-line', 'type': 'update-plot-params-check'}:
      print(f"\n\n更新ROC平滑参数")
      updated_param = trigger[0]['value']
    
      params_json = json_io('r')
      set_json_value(params_json, f"{params_json['current-ax-path']}.plot-params.args.smooth", updated_param)
      json_io('w', params_json)
    
    # 更新ROC线条粗细
    if plot_param_prop_id == {'index': 'line-width-roc', 'type': 'update-plot-params-value'}:
      print(f"\n\n更新ROC线条粗细")  
      updated_param = trigger[0]['value']
    
      params_json = json_io('r')
      set_json_value(params_json, f"{params_json['current-ax-path']}.plot-params.kwargs.linewidth", updated_param)
      json_io('w', params_json)
    
    
    # 更新对角线条粗细
    if plot_param_prop_id == {'index': 'line-width-diagonal', 'type': 'update-plot-params-value'}:
      print(f"\n\n更新对角线线条粗细")  
      updated_param = trigger[0]['value']
    
      params_json = json_io('r')
      set_json_value(params_json, f"{params_json['current-ax-path']}.plot-params.kwargs.linewidth", updated_param)
      json_io('w', params_json)
    
    
     
    
    
    
    
    
    
    
    
    params_json = json_io('r')
    
    if params_json['plot-fig-axes-path']: # 设置了作图图层才更新图片
      statical_single_plot_src = smart_plot_from_params_json(params_json)
    # else:
    #   message_container_children = fac.AntdMessage(
    #     content='如果要实时参数更新效果,请选择作图图层',
    #     type='warning'
    #   )
    
    
    return statical_single_plot_src, message_container_children
    

10.8.4 渲染import 部分

import pandas as pd
import re

# 对载入包集合去重的函数
def duplicate_import_set(import_set: set):
    '''
    import re
    import pandas as pd
    '''

    df = pd.DataFrame([re.split(r"(?<=[@|])", package) for package in import_set], columns = ['package', 'alias_or_subpackage'])

    # 填充空值为空字符串,后面处理的对象要求是字符串

    df.alias_or_subpackage = df.alias_or_subpackage.fillna('')


    # 分组聚合

    ## 聚合的结果要求是同组的alias_or_subpackage得到并集,防止重复导入

    ### 第一步:"+".join(x)将同一组的subpackage通过+连接成一个字符串

    ### 第二步: "+".join(x).split('+')再次将字符串分割成列表

    ### 第三步: set("+".join(x).split('+'))去除列表中的重复元素

    ### 第四步:"+".join(set("+".join(x).split('+')))再次将字符还原成原来通过+相连接的格式


    df = df.groupby('package').agg({'alias_or_subpackage': lambda x : "+".join(set("+".join(x).split('+')))}).reset_index()


    # 还原成import_set

    import_set = {f"{package}{alias_or_subpackage}" for package, alias_or_subpackage in df.values.tolist()}

    return import_set


rendered_statement_import = []

import_package_set = set(import_package_list)


import_package_set_deduplicated = duplicate_import_set(import_package_set)
                                                       
for import_statement in import_package_set_deduplicated:
    if "@" in import_statement:
        package, alias = import_statement.split("@")
        rendered_statement_import.append(f"import {package} as {alias}")
    elif "|" in import_statement:
        package, import_list_string = import_statement.split("|")
        import_list = import_list_string.split("+")
        rendered_statement_import.append(
            f"from {package} import {', '.join(import_list)}"
        )
    else:
        rendered_statement_import.append(f"import {import_statement}")

print("\n".join(rendered_statement_import))
from flask import session, request
import json
import numpy as np
from scipy import stats
import os
import feffery_utils_components as fuc
import seaborn as sb
from sklearn.linear_model import LogisticRegression
import sklearn.metrics as metrics
from uuid import uuid4
from dash import MATCH, Input, Output, ALL, State, callback, html
import pandas as pd
import shutil
from sklearn.ensemble import RandomForestClassifier
import dash
import matplotlib
import feffery_antd_components as fac
import matplotlib.pyplot as plt
#### 合并并导出为app.py
with open('data/app.py', 'w') as py:
    
    py.write(
        "\n\n\n".join(
            ["\n".join(rendered_statement_import), 
             "\n".join(rendered_statement_mytools),
             "\n".join(rendered_statement_app_setting), 
             rendered_statement_layout, 
             "\n".join(rendered_statement_callback), 
             "\n".join(rendered_statement_app_run)]
        )
    )

10.8.4.1 在vscode中打开

安装Black Formatter插件,按右键格式化文档,使python代码自动格式化。