2009-05-12 2 views
0

사전을 'locals'와 매우 흡사하게 사용하고 싶지만 함수의 제한된 범위에있는 변수 만 포함하는 상황에서 계속 끝납니다 . 파이썬에서이 작업을 수행 할 수있는 방법이 있습니까?파이썬에서만 함수 범위에 대한 로컬 사전 가져 오기

왜 내가 이것을하고 싶은지 조금 더 : 나는 장고와 놀고 있는데, 내 템플릿 컨텍스트를 제공 할 때 수동으로 사전을 만들거나 (DRY 원칙을 위반 함) 더 많은 항목을 포함하고있는 지역 주민()은 필요합니다 (낭비). 거기에 아마도 내가 Python 수준의 솔루션의 필요성을 완화 것이 장고로 실종 됐어?

가 명확히하려면

그래서, 반복적으로 공격 한 경우는 내가 가지고있는 곳입니다 :

@render_to('my_template.html') 
def myview(request): 
    var1 = #blahblah 
    var2 = #... 
    # do stuff with vars 
    return {'var1': val1,'var2':val2} 

을 그래서 그 대신 그 변수를 반복하고 명명 규칙, 내가 할 수있는 것들 :

@render_to('my_template.html') 
def myview(request): 
    var1 = #blahblah 
    var2 = #... 
    # do stuff with vars 
    return locals() 

나는 청소기를 찾았지만 현지인()에 약 30 개 이상의 항목이 있으므로 그 종류가 조금은 알 수 있습니다. 그러면 실제로 필요합니다.

+1

"수동으로 사전 작성 (DRY 원칙을 위반 함)"무엇이 사전을 DRY 위반으로 만드는가? –

+0

이 특정 상황을 의미하는 것입니다. 변수 (var = blahblah)를 선언하고 몇 줄 뒤에 { 'var': var}을 사용하면 이름 지정을 반복하는 것처럼 보일 것입니다.4 개 또는 5 개의 변수를 사용하면 귀찮고 지저분 해집니다. – Albinofrenchy

+0

나는 눈치 채지 못했다. 먼저 뷰 기능에 많은 로컬 변수를 만들지 않습니다. 일반적으로 몇 가지. 처리가 복잡하면 view 함수에서 처리를 해제합니다. 둘째, 뷰 함수의 일부가 아니지만 사전에서만 작성되는 상황 별 정보로 사전을로드하는 경우가 있습니다. 반복은 일반적으로 객체, object_list 및 때로는 요청에서 가져온 키 또는 두 개만 두세 가지입니다. –

답변

5

사전을 만드는 것이 DRY를 위반하는 것에 동의할지는 모르겠지만 실제로 아무것도 반복하고 싶지 않다면보기 상단에 '컨텍스트'사전을 정의 할 수 있습니다 보기 전체에서 변수 대신 사전 키를 사용하십시오.

def my_view(request): 
    context = {} 
    context['items'] = Item.objects.all() 
    context['anothervalue'] = context['items'][2].name 
    return render_to_response('template.html', context) 
4

사전에 DRY 위반을 전달하는 방법은 무엇입니까? Django is all about DRY, 그래서 나는 그것의 표준 행동을 직접 위반하는 의심. 두 경우 모두, 그러나, 나는 모든 것을 쉽게하기 위해 django-annoying의 수정 된 버전을 사용

@render_to('my_template.html') 
def myview(request): 
    # figure stuff out... 
    return {'var1':'val1','var2','val2'} 

render_to 장식은 요청 문맥의 관리와 모든 좋은 물건을합니다. 잘 작동합니다.

그래도 도움이되지 않는다면 질문을 수정 해 보시기 바랍니다. 무엇이든지 locals()으로 어지럽히고 싶다면 Django와 같은 상황에서는 특히 필요하지 않습니다.

+0

위의 설명을 추가했습니다 (코드가 주석에서 잘 작동하지 않습니다). 상관없이, 장고 짜증나는 표정이 매우 멋지다. 나는 오늘 get_object_or_none을 원했다. – Albinofrenchy

+0

+1 : 나는 DRY를 위반하지 않는다는 데 동의합니다. 사실, 템플리트 컨텍스트에 특정한 값 매핑을 작성함으로써, 이미 존재하지 않는 (즉, 맵핑) 무언가를 생성하므로 아무 것도 반복하지 않습니다. 템플릿 컨텍스트의 항목은 종종 해당 템플릿에 맞게 작성됩니다. 항상 뷰의 로직을 완전히 다시 작성할 수 있어야하지만, 항상 동일한 컨텍스트 사전을 만들어 다른 앱 레이어와 템플릿을 분리해야합니다. locals()를 템플릿에 전달하는 것은 특히 여러 개발자/디자이너가있는 프로젝트에서 위험합니다. –

+0

일반적인 경우 Jarret에서 필자는 동의합니다. 해당 매핑은 뷰 구현에 관계없이 템플릿을 준수 할 수 있어야합니다. 실제로 함수의 로컬 컨텍스트와 템플릿의 컨텍스트가 동일한 특정 상황이 발생하지만 실제로는 생각합니다. 나는 그것을 표현할 방법을 원한다. local()을 전달하는 것이 위험하다는 것에 동의합니다. 이는 내가이 질문을 쓴 이유 중 하나입니다. – Albinofrenchy

2

"낭비"때문에 현지인()을 사용하는 것이 좋지 않다고 말합니다. 무엇이 낭비입니까? 저는 그것이 반환하는 사전이 이미 존재한다고 믿습니다. 단지 그것에 대한 참조만을 제공합니다. 사전을 만들어야한다고하더라도 Python에서 가장 최적화 된 작업 중 하나이므로 걱정하지 마십시오.

오류 가능성이 가장 적은 의도를 표현하는 코드 구조에 중점을 두어야합니다. 걱정되는 쓰레기는 걱정할 필요가 없습니다.

+0

그의 관심사는 사용하지 않는 변수들로 템플릿의 범위를 오염시키고 있다고 생각합니다. – Jiaaro

2

나도 locals() 또는 특별히 원하는 경우 완전히 지정된 DICT {'var1':var1, 'var2': var2}이 가장 가능성이 OK입니다를 전달하는 다른 많은 응답자에 동의하면서 "일부"하나의 하드에서 멀리이다 locals()와 같은 DICT, 예에 :

loc = locals() 
return dict((k,loc[k]) for k in 'var1 var2'.split()) 
관련 문제