当前
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
的元素
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
模块源码
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 版权协议,转载请附上原文出处链接和本声明。