欢迎来到 Pymaidol!
Pymaidol 是一种标记语法,用于将 Python 代码嵌入文本中,使得文本在运行时可动态更改包含的内容。
与 ProMaid 相比,Pymaidol 不只是单纯的将数据嵌入至模板(Template)的对应位置,还能将复杂的处理逻辑呈现在模板中,甚至可使用在模板中定义的函数对数据进行处理。
Pymaidol 是一种标记语法,用于将 Python 代码嵌入文本中,使得文本在运行时可动态更改包含的内容。
与 ProMaid 相比,Pymaidol 不只是单纯的将数据嵌入至模板(Template)的对应位置,还能将复杂的处理逻辑呈现在模板中,甚至可使用在模板中定义的函数对数据进行处理。
python >= 3.10
pip install Pymaidol -i https://pypi.python.org/simple
首先,假设你创建了一个名为 pymaidol_test 的文件夹。使用编辑器或者 IDE 打开该文件夹作为工作目录。
在 pymaidol_test 文件夹下打开命令行,输入以下命令:
python -m pymaidol -n FirstTemplate
FirstTemplate 是模板类的类名。命令行会输出以下内容,同时文件夹中会生成 FirstTemplate.pymd 和 FirstTemplate.py 两个文件:
Success: file "FirstTemplate.pymd" created
Success: file "FirstTemplate.py" created
首先,用以下代码将 FirstTemplate.pymd 中的全部内容替换掉:
from pymaidol import TemplateBase
from pymaidol.AnnotationType import FULL_ANNOTATION_TYPE, AnnotationTypeEnum
class FirstTemplate(TemplateBase):
def __init__(self,
package_name:str,
template: str | None = None,
template_file_path: str | None = None,
supported_annotation_types: list[AnnotationTypeEnum] = FULL_ANNOTATION_TYPE,
disable_annotation_types: list[AnnotationTypeEnum] = []) -> None:
super().__init__(template, template_file_path, supported_annotation_types, disable_annotation_types)
self.package_name = package_name
def main():
template = FirstTemplate("Pymaidol")
string = template.Render({"says": "Hello World"})
print(string)
if __name__ == "__main__":
main()
这段代码主要修改了以下部分:
FirstTemplate 类添加了 package_name 属性。main 函数,以实例化 FirstTemplate 类。向 FirstTemplate 类的构造函数传入了 package_name 参数,该参数的值为 Pymaidol。Render 方法,向其传入了一个字典 {"says": "Hello World"}。然后,用以下代码替换 FirstTemplate 类中的全部内容:
@{import time}
Now (@(time.ctime())), Say "@(says)" using @(self.package_name)!
运行 FirstTemplate.py,命令行会输出以下内容:
Now (Tue May 23 19:21:19 2023), Say "Hello World" using Pymaidol!
使用以下命令创建模板文件:
python -m pymaidol -n <类名> [-d <目录>]
会在当前目录下生成 <类名>.pymd 和 <类名>.py 两个文件。
模板文件由模板设计文件 .pymd 和模板后台文件 .py 组成。
模板设计文件 .pymd:包含了模板的设计内容,如字符串和使用 Pymaidol 语法嵌入的 Python 代码/呈现表达式。
模板后台文件 .py:包含了模板的后台逻辑,如模板类的定义。
可以在设计文件中访问在后台文件中定义的变量和方法,但不能在后台文件中访问在设计文件中定义的元素。此外,两者的 import 语句是独立的。
若手动创建 Pymaidol 模板文件,模板设计文件
.pymd和模板后台文件.py的文件名必须相同,且位于同一个文件夹下;模板后台文件的文件名必须与模板类的类名相同。
Pymaidol 使用 @ 作为标记符,用于标记 Pymaidol 表达式、关键字和代码块。若要在文本中使用 @,请使用 @@ 代替。
Pymaidol 表达式用于向模板中嵌入/呈现数据。Pymaidol 表达式的格式为 @(<表达式>) ,如:
@("Hello World!")
渲染后的文本为:
Hello World!
关键字的格式为 @<关键字>;,如:
@break; # 跳出当前循环
@continue; # 跳过当前循环
Pymaidol 代码块用于在模板渲染时执行一些 python 代码。格式为 @{<代码块>},如:
@{answer = 42}
The answer of this universe is @(answer)
渲染后的文本为:
The answer of this universe is 42
因为渲染 Pymaidol 代码块是按照由上至下、由左至右的顺序进行的,所以可以使用 Pymaidol 代码块来定义一些变量、函数等,在之后的表达式或代码块中使用。
使用方式为 @if (<条件表达式>){<模板设计语句>},如:
@{answer = 42}
@if (answer > 0) {answer == @(answer), and it is positive.}
@elif (answer < 0) {answer == @(answer), and it is negative.}
@else {answer == @(answer), and it is zero.}
渲染后的文本为:
answer == 42, and it is positive.
使用方式为 @while (<条件表达式>){<模板设计语句>},如:
@{i = 0}
@while (i < 5){
i = @(i)
@{i += 1}
}
渲染后的文本为:
i = 0
i = 1
i = 2
i = 3
i = 4
使用方式为 @for (<变量> in <可迭代对象>){<模板设计语句>},如:
@for (i in range(5)){
i = @(i)
@if (i == 3) {@break;}
}
渲染后的文本为:
i = 0
i = 1
i = 2
i = 3
| 名称 | 描述 |
|---|---|
| AnnotationType | 提供了可在模板设计文件中.pymd使用的注释的枚举类型。 |
| 名称 | 描述 |
|---|---|
| Position | 用于定位在原始模板字符串中的位置。 |
| TemplateBase | Pymaidol 模板的后台类,是所有 Pymaidol 模板类的基类。 |
| TemplateRenderer | 将模板字符串渲染为字符串的类。 |
AnnotationType 模块提供了可在模板设计文件中.pymd使用的注释的枚举类型。
模块:pymaidol
from pymaidol import AnnotationType
| 名称 | 描述 |
|---|---|
| AnnotationTypeEnum 枚举 | AnnotationTypeEnum 枚举是所有注释种类枚举类的基类。内部无枚举值,只用于被继承。 |
| SingleLineAnnotationTypeEnum 枚举 | 包含了可在模板设计文件中.pymd使用的单行注释的类型。 |
| MultiLineAnnotationTypeEnum 枚举 | 包含了可在模板设计文件中.pymd使用的多行注释的类型。 |
| 名称 | 类型 | 描述 |
|---|---|---|
| FULL_ANNOTATION_TYPE | list[AnnotationTypeEnum] | 包含了所有注释种类枚举类的枚举值的列表。 |
AnnotationTypeEnum 枚举是所有注释种类枚举类的基类。内部无枚举值,只用于被继承。
继承自:enum.Enum
from pymaidol import AnnotationTypeEnum
或
from pymaidol.AnnotationType import AnnotationTypeEnum
包含了可在模板设计文件中.pymd使用的多行注释的类型。
继承自:pymaidol.AnnotationType.AnnotationTypeEnum
from pymaidol import MultiLineAnnotationTypeEnum
或
from pymaidol.AnnotationType import MultiLineAnnotationTypeEnum
| 名称 | 值 | 描述 |
|---|---|---|
| Python | ’'' | Python 的多行注释,即以 ''' 开头和结尾的注释。 |
| C | /* | C 的多行注释,即以 /\* 开头和 */ 结尾的注释。 |
| HTML | <!– | HTML 的多行注释,即以 <!-- 开头和 --> 结尾的注释。 |
包含了可在模板设计文件中.pymd使用的单行注释的类型。
继承自:pymaidol.AnnotationType.AnnotationTypeEnum
from pymaidol import SingleLineAnnotationTypeEnum
或
from pymaidol.AnnotationType import SingleLineAnnotationTypeEnum
| 名称 | 值 | 描述 |
|---|---|---|
| Python | # | Python 的单行注释,即以 # 开头的注释。 |
| C | // | C 的单行注释,即以 // 开头的注释。 |
Position 类用于定位在原始模板字符串中的位置。
Position 的对象里的属性是只读的,初始化之后不允许被修改。
注意:当 Position 类用于结束位置时,是包括该位置的字符的。比如:如果 start.total = 20, end.total = 30,那么对原模板字符串的切片应该为 template[20:31]。
模块:pymaidol.Positions
from pymaidol import Position
或
from pymaidol.Positions import Position
Position(line_index, char_index, total)line_index (int): 行索引。从 0 开始。char_index (int): 当前行的字符索引。从 0 开始。total (int): 字符索引。从 0 开始。line_index (int,readonly)行索引。从 0 开始。
char_index (int,readonly)当前行的字符索引。从 0 开始。
total (int,readonly)字符索引。从 0 开始。
full_description (str,readonly)完整的、人类可读的位置描述。
Position.Default()@ classmethod
新建并返回一个默认的 Position 对象,其所有属性均为 0。
无。
Position)默认的 Position 对象。
Copy()复制并返回一个新的 Position 对象。
无。
Position)新的 Position 对象,且其所有属性与原对象相同。
TemplateBase 类是 Pymaidol 模板的后台类,是所有 Pymaidol 模板类的基类。是不可实例化的抽象类,需要被继承使用。
模块:pymaidol.TemplateBase
继承自:abc.ABC
from pymaidol import TemplateBase
或
from pymaidol.TemplateBase import TemplateBase
TemplateBase(template, template_file_path, supported_annotation_types, disable_annotation_types) (virtual)template (str, optional): 模板字符串。默认为 None。template_file_path (str, optional): 模板文件路径。默认为 None。supported_annotation_types (list[AnnotationTypeEnum], optional): 支持的注释类型列表。默认为所有注释类型(Python、C的单行与多行注释、HTML注释)。disable_annotation_types (list[AnnotationTypeEnum], optional): 禁用的注释类型列表,使这些注释出现在渲染后的文本中。默认为空。禁用的优先级高于支持。例如,如果 disable_annotation_types 中包含 AnnotationTypeEnum.SingleLineAnnotationTypeEnum.Python (python 单行注释),则 supported_annotation_types 中无论是否包含它,都将被视为禁用该注释类型。当 template 与 template_file_path 都为 None 时,TemplateBase 类及其子类将试图读取在与其同一目录下、与其同名的模板文件 .pymd。如果两个都不为空,则优先使用 template。
rendered(str,readonly)渲染后的字符串。如果自初始化或调用 HotReload() 方法以来没有调用过 Render() 方法,则为 None。
template(str,readonly)模板字符串。
HotReload(template, template_file_path) (final)重新加载模板。
template (str, optional): 模板字符串。默认为 None。template_file_path (str, optional): 模板文件路径。默认为 None。当 template 与 template_file_path 都为 None 时,TemplateBase 类及其子类将试图读取在与其同一目录下、与其同名的模板文件 .pymd。如果两个都不为空,则优先使用 template。
None)无。
Render(inject_kwargs) (final)给与数据并渲染模板字符串。
inject_kwargs (dict, Optional): 用于渲染模板字符串的外部注入变量。默认为 None。注入的变量将会作为局部变量。str)渲染后的字符串。
将模板字符串渲染为字符串的类。
模块:pymaidol.TemplateRenderer
from pymaidol import TemplateRenderer
或
from pymaidol.TemplateRenderer import TemplateRenderer
TemplateRenderer(template, supported_annotation_types)template (str): 模板字符串。supported_annotation_types (list[AnnotationTypeEnum], optional): 支持的注释类型列表。默认为所有注释类型(Python、C的单行与多行注释、HTML注释)。template(str,readonly)模板字符串。
TemplateRenderer.ReadFromFile(template_file_path, supported_annotation_types) (classmethod)给定模板文件路径,返回一个 TemplateRenderer 对象。
template_file_path (str): 模板文件路径。supported_annotation_types (list[AnnotationTypeEnum]): 支持的注释类型列表。TemplateRenderer: TemplateRenderer 对象。
Render(local_vars, global_vars) (final)给与数据并渲染模板字符串。
local_vars (dict): 用于渲染模板字符串的局部变量。global_vars (dict,可选): 用于渲染模板字符串的全局变量。默认为 None。str: 渲染后的字符串。