pyecharts源码解读(6)工具包commons概述:封装JavaScript代码、有序集合数据结构、移除字典中值为None的元素

  • Post author:
  • Post category:java


当前

pyecharts

版本为

1.9.0



概述


commons

包位于

pyecharts

包顶级目录中,用于定义

pyecharts

的工具类和工具函数。包结构如下:

├─commons # 工具包
│  │  utils.py # 定义工具类、工具函数
│  │  __init__.py # 空文件


commons

包的主要功能定义在

utils.py

模块中。

utils.py

模块的主要元素如下:


  • JsCode( js_code: str)

    类:封装JavaScript代码,在JavaScript代码两端增加分隔符

    --x_x--0_0--

    。典型应用位于

    pyecharts/charts/base.py

    模块中的

    Base

    类和

    pyecharts/globals.py

    模块中的

    ToolTipFormatterType

    变量。

  • replace_placeholder(html: str) -> str

    函数:格式化JavaScript代码,将分隔符

    --x_x--0_0--

    替换为空字符串。典型应用位于

    pyecharts/charts/base.py

    模块中的

    Base

    类。

  • replace_placeholder_with_quotes(html: str)

    函数:格式化JavaScript代码,将分隔符

    --x_x--0_0--

    替换为引号。典型应用位于

    pyecharts/charts/base.py

    模块中的

    Base

    类。

  • remove_key_with_none_value(incoming_dict)

    函数:递归移除字典中值为

    None

    的元素。相关函数为

    _expand



    _clean_array



    _clean_dict

    。典型应用位于

    pyecharts/charts/base.py

    模块中的

    Base

    类。

  • _flat(obj)

    函数:将对象展平为元组或列表或集合。

  • OrderedSet(*args)

    类:构造”有序集合”数据结构,可返回一个不包含重复元素的按添加顺序排列的列表。典型应用位于

    pyecharts/charts/base.py

    模块中的

    Base

    类中的

    js_functions



    js_dependencies

    属性。

  • produce_require_dict(js_dependencies, js_host) -> dict

    函数:构造js依赖库配置。典型应用位于

    pyecharts/render/engine.py

    模块中的

    render_notebook

    函数。

在这里插入图片描述



案例:封装、格式化JavaScript代码

from pyecharts.commons import utils

code='''"var a=10;"'''
#封装JavaScript代码
result=utils.JsCode(code)
print(repr(result.js_code))
#格式化JavaScript代码,去除占位符
print(repr(utils.replace_placeholder(result.js_code)))
#格式化JavaScript代码,去除占位符,用引号替代
print(repr(utils.replace_placeholder_with_quotes(result.js_code)))

输出为:

'--x_x--0_0--"var a=10;"--x_x--0_0--'
'var a=10;'
'"var a=10;"'



案例:递归移除字典中值为

None

的元素

from pyecharts.commons import utils

data= {"a":1,"b":None,"c":{"d":None},"e":[{"f":None}]}
result=utils.remove_key_with_none_value(data)
print(result)

输出为:

{'a': 1, 'c': {}, 'e': [{}]}



案例:构造“有序集合”

from pyecharts.commons import utils

# 构造“有序集合”,其实结构是列表
a= utils.OrderedSet(3,1)
# 输出“有序集合”以及辅助字典
print(a.items,a._values)
# “有序集合”添加重复元素
a.add(2,3)
print(a.items,a._values)

# 常规集合,元素无序
b=set([3,1,2])
print(b)

输出为:

[3, 1] {3: True, 1: True}
[3, 1, 2] {3: True, 1: True, 2: True}
{1, 2, 3}



案例:输出pyecharts依赖库配置

from pyecharts.commons import utils
from pyecharts.charts import Bar

bar=Bar()
data = utils.produce_require_dict(bar.js_dependencies,bar.js_host)
print(data)

输出为:

{'config_items': ["'echarts':'https://assets.pyecharts.org/assets/echarts.min'"], 'libraries': ["'echarts'"]}




utils.py

模块源码

import re

from ..datasets import EXTRA, FILENAMES


class JsCode:
    def __init__(self, js_code: str):
        self.js_code = "--x_x--0_0--" + js_code + "--x_x--0_0--"

    def replace(self, pattern: str, repl: str):
        self.js_code = re.sub(pattern, repl, self.js_code)
        return self


class OrderedSet:
    def __init__(self, *args):
        self._values = dict()
        self.items = []
        for a in args:
            self.add(a)

    def add(self, *items):
        for item in items:
            if not self._values.get(item, False):
                self._values.update({item: True})
                self.items.append(item)


def produce_require_dict(js_dependencies, js_host) -> dict:
    confs, libraries = [], []
    for name in js_dependencies.items:
        if name.startswith("https://api.map.baidu.com"):
            confs.append("'baidu_map_api{}':'{}'".format(len(name), name))
            libraries.append("'baidu_map_api{}'".format(len(name)))
        if name in FILENAMES:
            f, _ = FILENAMES[name]
            confs.append("'{}':'{}{}'".format(name, js_host, f))
            libraries.append("'{}'".format(name))
        else:
            for url, files in EXTRA.items():
                if name in files:
                    f, _ = files[name]
                    confs.append("'{}':'{}{}'".format(name, url, f))
                    libraries.append("'{}'".format(name))
                    break
    return dict(config_items=confs, libraries=libraries)


def replace_placeholder(html: str) -> str:
    return re.sub('"?--x_x--0_0--"?', "", html)


def replace_placeholder_with_quotes(html: str) -> str:
    return re.sub("--x_x--0_0--", "", html)


def _flat(obj):
    if hasattr(obj, "js_dependencies"):
        return list(obj.js_dependencies)

    if isinstance(obj, (list, tuple, set)):
        return obj

    return (obj,)  # tuple


def _expand(dict_generator):
    return dict(list(dict_generator))


def _clean_dict(mydict):
    for key, value in mydict.items():
        if value is not None:
            if isinstance(value, dict):
                value = _expand(_clean_dict(value))

            elif isinstance(value, (list, tuple, set)):
                value = list(_clean_array(value))

            elif isinstance(value, str) and not value:
                # delete key with empty string
                continue

            yield key, value


def _clean_array(myarray):
    for value in myarray:
        if isinstance(value, dict):
            yield _expand(_clean_dict(value))

        elif isinstance(value, (list, tuple, set)):
            yield list(_clean_array(value))

        else:
            yield value


def remove_key_with_none_value(incoming_dict):
    if isinstance(incoming_dict, dict):
        return _expand(_clean_dict(incoming_dict))
    elif incoming_dict:
        return incoming_dict
    else:
        return None



版权声明:本文为mighty13原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。