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

当前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_functionsjs_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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值