欢迎来到 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
: 渲染后的字符串。