2016-11-03 7 views
0

나는이 람다 함수 (렌더링)에 내 머리를 감쌀 수 없다. 그것은 메 자닌 폴더의 유틸리티에서이다 : 나는 함수의 내 자신의 버전으로 템플릿 목록을 전달하기 위해 노력하고있어mezzaninie utils의 Python lambda

def send_mail_template(subject, template, addr_from, addr_to, context=None, 
        attachments=None, fail_silently=None, addr_bcc=None, 
        headers=None): 
    """ 
    Send email rendering text and html versions for the specified 
    template name using the context dictionary passed in. 

    EDITED FOR SIMPLICITY 
    """ 

    context.update(context_settings()) 

    # Loads a template passing in vars as context. 
    render = lambda type: loader.get_template("%s.%s" % 
         (template, type)).render(Context(context)) 

    # Create and send email. 
    msg = EmailMultiAlternatives(subject, render("txt"), 
          addr_from, addr_to, addr_bcc, 
          headers=headers) 
    msg.attach_alternative(render("html"), "text/html") 
    msg.send(fail_silently=fail_silently) 

. 그래서 템플리트에 대한 경로의 문자열 인 "template"매개 변수는 경로 문자열의 목록 (템플리트)이됩니다. 그럼 난 목록을 반복하고 람다에서 일어나는 일을 적용하고, 그 다음에 .render (Context (context))를 호출해야합니다.

이 이제까지 추한 코드 그러나 이것은 내가 최종 결과로 필요한 보여줍니다

render = lambda type: loader.get_template("%s.%s" % 
        (templates[0], type)) 

render2 = lambda type: loader.get_template("%s.%s" % 
        (templates[1], type)) 

# Create and send email. 
msg = EmailMultiAlternatives(subject,(render("txt")+render2('txt')).render(Context(context)), 
         addr_from, addr_to, addr_bcc, 
         headers=headers) 
msg.attach_alternative((render("html")+render2('html').render(Context(context)), "text/html") 
msg.send(fail_silently=fail_silently) 

위의 작업을 수행하지만 분명히 단지 구역질 및 목록은 알 수없는 길이 될 것입니다.

주세요! 누구든지 람다 함수를 생성 할 수 있습니까?

Answer with help from Arthur Tacca 

내가 함께 템플릿을 적층하여 이메일 몸을 만들려고, 그래서 하나로서 함께 TXT 및 HTML 본문으로 렌더링되는 템플릿 목록에 전달해야 해요. 여기서 일하는 작업은 다음과 같습니다
rendered = loader.get_template("%s.%s" % (template, "txt")).render(Context(context)) 

내가에만이 단순화를 추측 :

def render_templates(types,templates,context): 
    template_body = '' 
    for template in templates: 
     template_body += loader.get_template("%s.%s" % (template, types)).render(Context(context)) 
    return template_body 

def send_mail_template(subject, templates, addr_from, addr_to, context=None, 
        attachments=None, fail_silently=None, addr_bcc=None, 
        headers=None): 
    """ 
    ... 
    """ 
    context.update(context_settings()) 

    msg = EmailMultiAlternatives(subject, render_templates("txt",templates,context), 
          addr_from, to, [], 
          headers) 
    msg.attach_alternative(render_templates("html",templates,context), "text/html") 

    msg.send(fail_silently=fail_silently) 

답변

1

난 당신이 (첫 번째 예를 들어) 단지 기능/람다를 사용하여 모든보다는하는 이유에 분명 아니에요 이 일을하는 상황을 단순화했기 때문에 효과가 있습니다. 아마 실제 코드에서 나중에 호출 될 렌더 함수를 어딘가에 전달해야합니다. 그렇지 않다면 람다를 완전히 제거 할 수 있습니다. 여기

사소한 점이다하지만 조금 명확하게 것들을 만들 수 있습니다

render = lambda type: loader.get_template("%s.%s" % 
        (templates[0], type)) 
render2 = lambda type: loader.get_template("%s.%s" % 
        (templates[1], type)) 

와 사이에 전혀 차이가 없습니다 :

def render(type): 
    return loader.get_template("%s.%s" % (templates[0], type)) 
def render2(type): 
    return loader.get_template("%s.%s" % (templates[1], type)) 

(OK, 하나 개 약간의 차이는 당신이 얻을 것입니다 사실 두 번째 형식은 더 좋은 스타일입니다 (일명 "더 파이썬적인"입니다). 람다를 사용하는 유일한 이유는 함수가 너무 짧아서 변수에 할당하지 않고 다른 함수로 전달되는 경우입니다. 귀하의 경우에는

이 당신이 좋아하는 경우에 당신은 반복을 사용할 수 있다는 것을 의미 :

def render_all(types): 
    result_list = [] 
    for type, template in zip(types, templates): 
     result_list.append(loader.get_template("%s.%s" % (template, type))) 
    return "".join(result_list) 

이 목록의 이해/발전기에 대한 익은입니다 : 내가 아주 명확 무엇을하지 않았다

def render_all(types): 
    return "".join(loader.get_template("%s.%s" % (template, type)) 
        for type, template in zip(types, templates)) 
+0

전 묻고 있었지만 당신의 대답으로 작동하도록했습니다. 많은 감사. 편집 된 질문보기 – joeskru

관련 문제