python 노트 (3) 모델
이전 글 은 정규 표현 식 을 말 했 습 니 다. 내용 은 기본적으로 시스템 문서 에서 나 왔 습 니 다. 여기 서 예 를 들 어 모드 해석 기 를 만들어 야 합 니 다.먼저 간단 한 모델 을 보 세 요.
Hello {{name}}
우리 의 임 무 는
name
을 우리 가 지정 한 이름 으로 바 꾸 는 것 입 니 다. 여기 {}} 을 태그 기호 로 하 는 것 입 니 다.템 플 릿 은 여러 곳 에서 사용 되 었 는데 주로 교체 작업 을 찾 고 복잡 한 논리 구 조 를 가 집 니 다.논리 적 구 조 를 가 진 모드:{if a>b}
a b
{end if}
순환 구조 가 있 는 모드:
{for a in names}
{{a}}
{end for}
2
{{}}
이 임 무 는 어떻게 해 야 합 니까? 가장 간단 한 것 부터 먼저 내용 을 찾 은 다음 에 교체 해 야 합 니 다.def translate(template,context)
위 에서 저 는 함 수 를 정 의 했 습 니 다. 이 함 수 는 모델 을 받 아들 인 다음 에 모델 에서 관련 내용 을 분석 하고 context 에서 해당 하 는 값 을 가 져 옵 니 다.
str ='{{name}}is {{age}} years old'
pattern = re.compile(r'{{(.*?)}}')
context = {'name':'dongge','age':18}
def lookup(m):
try:
key = m.group(1)
if key in context:
return "{}".format(context[key])
except Exception as e:
return ""
pattern.sub(lookup,test_str)
'donggeis 18 years old'
pif = re.compile(r'{\s*?if\s+(?P.+?)\s*?}(?P.*?){\s*?end\s+?if\s*?}',re.MULTILINE)
test_str = '{if 1>2}hhh{end if}'
m=pif.search(test_str)
m.groupdict()
#{'cond': '1>2', 'content': 'hhh'}
def calccond(cond,context):
try:
return eval(cond,context)
except Exception as e:
return False
cond = m.group('cond')
calccond(cond,None)
#False
pfor = re.compile(r'{\s*?for\s+(?P.+?)\s+in\s+(?P.+?)\s*?}(?P.*?){\s*?end\s+?for\s*?}',re.MULTILINE)
test_str='{for a in names}\
hello\
{end for}'
m=pfor.search(test_str)
m.groupdict()
#{'content': 'hello', 'val': 'a', 'vals': 'names'}
def executefor(m,context):
content = m.group('content')
val = m.group('val')
vals = m.group('vals')
if vals in context:
vals = context[vals]
else:
vals = []
for v in vals:
context[val] = v
....
return ...
위의 코드 는 세 가지 기능 에 초 략 적 으로 실현 되 었 으 나, 여기에 약간의 문제 가 존재 한다.출력 기능 은 간단 한 문장 에 속 하고 조건 과 순환 문장 은 복합 문장 에 속한다.
3
실제 모드 처리 에서 우 리 는 정규 표현 식 으로 세 가지 상황 을 함께 처리 할 것 입 니 다. 그러면 이 표현 식 들 은 바로 또는 관계 입 니 다.
token_specification = [('exp',r'{{.*?}}'),
('ifstmt',r'{\s*?if\s+.+?\s*?}.*?{\s*?end\s+?if\s*?}'),
('forstmt',r'{\s*?for\s+.+?\s+in\s+.+?\s*?}.*?{\s*?end\s+?for\s*?}')]
tok_regex = '|'.join('(?P%s)' % pair for pair in token_specification)
p_temp = re.compile(tok_regex)
위의 코드 는 세 가지 상황 에서 정규 표현 식 을 보 여 주 었 습 니 다.
|
으로 이 표현 식 을 연결 하 였 습 니 다. 여기 서 세 가지 상황 에서 표현 식 의 이름 을 붙 여 주 었 습 니 다. 이렇게 하면 나중에 구분 하 는 것 이 도대체 그런 표현 식 인지 식별 할 수 있 습 니 다.import re
p_exp = re.compile(r'{{(?P.*?)}')
p_if = re.compile(r'{\s*?if\s+(?P.+?)\s*?}(?P.*?){\s*?end\s+?if\s*?}')
p_for = re.compile(r'{\s*?for\s+(?P.+?)\s+in\s+(?P.+?)\s*?}(?P.*?){\s*?end\s+?for\s*?}')
def render_template(template,context):
def replace_fun(m):
kind = m.lastgroup
value = m.group(kind)
if kind == 'exp':
return handle_exp(value,context)
elif kind == 'ifstmt':
return handle_if(value,context)
elif kind == 'forstmt':
return handle_for(value,context)
return p_temp.sub(replace_fun,template)
주 함 수 는
render_template
입 니 다. 이 함수 에서 저 는 함 수 를 정 의 했 습 니 다.이 함 수 를 정의 하 는 이 유 는 sub 함수 의 첫 번 째 매개 변 수 는 match object
이지 만 표현 식 의 값 을 계산 하기 위해 서 는 문맥 정보 가 필요 하기 때 문 입 니 다.다음은 세 가지 상황 을 각각 처리 하 는 것 입 니 다. 표현 식 에 있어 서 가장 간단 하지만 조건 과 순환 문 구 는 복합 문 에 속 하기 때문에 이 함수 에서 주 함 수 를 호출 합 니 다.def handle_exp(template,context):
m = p_exp.match(template)
exp = m.group('exp')
ret = eval(exp,context)
return "{}".format(ret)
def handle_if(template,context):
print(template)
m = p_if.match(template)
cond = m.group('cond')
content = m.group('content')
ret = eval(cond,context)
if isinstance(ret,bool) and ret:
return render_template(content,context)
return ''
def handle_for(template,context):
m = p_for.match(template)
name = m.group('name')
vals = m.group('vals')
content = m.group('content')
ret = eval(vals,context)
rstr = []
try:
for v in ret:
context[name] = v
rstr.append(render_template(content,context))
except Exception as e:
print(e)
return ''
return ''.join(rstr)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.