我使用 Jinja2 從模板創建 Python 類。我的模板看起來像
class {{class_name}}({{base_class_name}}):
def __init__(self, {{ parameters|join(', ') }}):
{{comment}}
super().__init__()
{% for param in parameters%}
self.{{param}} = {{param}}
{%- endfor %}
{# First variant #}
self.parameters1 = {{parameter_list}}
{# Second variant #}
self.parameters2 = {{['self.'] | product(parameters) | map('join') | list}}
我的python腳本被定義為
from itertools import product
from pathlib import Path
import jinja2
def create_class_from_template():
templates_path = Path(__file__).parent / 'templates'
jinja_env = jinja2.Environment(loader=jinja2.FileSystemLoader(templates_path))
jinja_env.filters['product'] = product
parameters = ['param1', 'param2', 'param3'] # For first variant
parameter_list = [f'self.{param}' for param in parameters] # For second variant
template_variables = {
'class_name': 'TestClass',
'base_class_name': 'BaseClass',
'comment': '"""My generated class"""',
'parameters': parameters,
'parameter_list': parameter_list
}
template = jinja_env.get_template('class_template.py.jinja2')
my_class = template.render(template_variables)
with open('my_new_class.py', 'w') as file:
file.write(my_class)
create_class_from_template()
這將創建以下 python 檔案
class TestClass(BaseClass):
def __init__(self, param1, param2, param3):
"""My generated class"""
super().__init__()
self.param1 = param1
self.param2 = param2
self.param3 = param3
self.parameters1 = ['self.param1', 'self.param2', 'self.param3']
self.parameters2 = ['self.param1', 'self.param2', 'self.param3']
但是串列應該包含成員本身,而不是字串,因此它是self.parameters = [self.param1, self.param2, self.param3].
有人知道如何使用 Jinja2 和 Python 創建這樣的串列嗎?
uj5u.com熱心網友回復:
它可以在不更改腳本的情況下作業,只需像這樣制作模板:
class {{class_name}}({{base_class_name}}):
def __init__(self, {{ parameters|join(', ') }}):
{{comment}}
super().__init__()
{% for param in parameters%}
self.{{param}} = {{param}}
{%- endfor %}
self.parameters = [{% for param in parameters %}self.{{ param }}{%- if not loop.last %}, {% endif %}{% endfor %}]
輸出也更整潔。然后您只需要一個模板變數(parameters),您可以在模板本身中進行格式化。
class TestClass(BaseClass):
def __init__(self, param1, param2, param3):
"""My generated class"""
super().__init__()
self.param1 = param1
self.param2 = param2
self.param3 = param3
self.parameters = [self.param1, self.param2, self.param3]
uj5u.com熱心網友回復:
您可以在串列中的模板中使用 for 回圈:
[{% for param in parameter_list%} {{param}} {%- endfor %}]
如果您按以下方式更改代碼將起作用
你的腳本
from itertools import product
from pathlib import Path
import jinja2
def create_class_from_template():
templates_path = '/home/lucas/capagile_codes/templates'
jinja_env = jinja2.Environment(loader=jinja2.FileSystemLoader(templates_path))
jinja_env.filters['product'] = product
parameters = ['param1', 'param2', 'param3']
parameter_list = [f'self.{param},' for param in parameters[:-1]] # modified line
parameter_list.append(f'self.{parameters[-1]}') # added line
template_variables = {
'class_name': 'TestClass',
'base_class_name': 'BaseClass',
'comment': '"""My generated class"""',
'parameters': parameters,
'parameter_list': parameter_list
}
template = jinja_env.get_template('class_template.py.jinja2')
my_class = template.render(template_variables)
with open('my_new_class.py', 'w') as file:
file.write(my_class)
create_class_from_template()
你的神社模板
class {{class_name}}({{base_class_name}}):
def __init__(self, {{ parameters|join(', ') }}):
{{comment}}
super().__init__()
{% for param in parameters%}
self.{{param}} = {{param}}
{%- endfor %}
self.parameters = [{% for param in parameter_list%} {{param}} {%- endfor %}]
結果檔案
class TestClass(BaseClass):
def __init__(self, param1, param2, param3):
"""My generated class"""
super().__init__()
self.param1 = param1
self.param2 = param2
self.param3 = param3
self.parameters = [ self.param1, self.param2, self.param3]
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/518017.html
標籤:Python神社2
上一篇:動態調整面板/框架/樹視圖的大小
下一篇:在多個檔案中搜索單詞的最有效方法
