htexpr将html字符串编译成python表达式
htexpr的Python项目详细描述
htexpr
htexpr将类似html的语法编译成python表达式。它是 灵感来源于JSX,旨在补充优秀的dash 包,它允许您在 Python。下面是一个示例,一个简单的ascii表:
app.layout=htexpr.compile("""<div> <table style={"margin": "0 auto"}> <tr><th>char</th><th>name</th><th>category</th></tr> [ (<tr style={'background-color': '#eee' if line % 2 else '#ccc'}> <td>{ char }</td> <td>{ unicodedata.name(char, '???') }</td> <td>{ unicodedata.category(char) }</td> </tr>) for line, char in enumerate(chr(i) for i in range(32, 128)) ] </table></div>""").run()
将其与使用函数调用的类似实现进行比较:
app.layout=html.Div([html.Table(style={"margin":"0 auto"},children=[html.Tr(html.Th("char"),html.Th("name"),html.Th("category"))]+[html.Tr([html.Td(char),html.Td(unicodedata.name(char,'???')),html.Td(unicodedata.category(char))],style={'background-color':'#eee'ifline%2else'#ccc'})forline,charinenumerate(chr(i)foriinrange(32,128))])])
后者有一个小错误,在我看来很容易犯 意外,但在htexpr语法中完全避免。
有点复杂的Unicode table示例 进一步演示语法。
API
使用以下导入:
importdash_core_componentsasdccimportdash_html_componentsashtmlimportdash_table
然后用表达式和诸如
之类的元素调用htexpr.compile
<div class="c"><Input id="i" type="number" /></div>
将转换为python函数调用:
html.Div(className="c", children=[
dcc.Input(id="i", type="number", children=[])
])
html
标记可以在任何情况下写入,dcc
标记必须在
与函数名大小写完全相同。属性变成
className
和其他一些小写属性,如rowspan
转化为驼峰病例(rowSpan
)。以及map_tag
map_attribute
关键字参数覆盖这些默认值。
表达式必须使用其eval
方法求值
有效,对引用的所有变量都有适当的绑定
(包括进口dash_html_components as html
等)a
在调用中捕获全局和局部的方便方法
环境是run
。
语法
所有标记都必须关闭:<div>...</div>
或<div />
。字面意义的
属性值必须出现在引号中,python值必须出现在括号中
[]
或大括号{}
。元素中的文本也可以包括python
括号或大括号中的表达式。
大括号可以包含任何python表达式,但大括号不是 包含在表达式中;但是,如果顶部有冒号 作为属性值出现的表达式的级别,大括号是 包括。这允许使用 以错误的类型注释为代价的单级大括号。 括号包含在表达式中,因此它们总是指定一个列表 价值。括号中的表达式被拼接到 父元素,因此
<ul>
<li> Item Zero </li>
[(<li> Item {i} </li>) for i in range(1,10)]
<li> Item Ten </li>
</ul>
结果是一个包含11个元素的单一平面列表
ul
元素。此拼接仅由托架触发
语法,因此大括号内的列表值表达式不能获取
拼接处理。
htexpr语法可以嵌套在python表达式中,但是
子表达式必须括在括号中:(<li>...</li>)
。
开发状态
我写这篇文章是为了帮助我完成一个我一直在做的项目 上面显示的那种括号错误。代码适用于 目的是这样的,但有可能是我没有 考虑过的。
这里使用的python语法非常简单:它可以识别 字符串和各种括号表达式。通过了解更多 python也许可以消除 比较运算符和标记,因此不需要 将嵌套表达式括在括号中。
错误消息并不总是有用的,尤其是代码 对象还没有可靠的行号数据。
由于库使用ast
模块创建代码对象,因此
可能相当依赖于cpython实现。我没看
使用另一个python需要做多少工作
实现。