2009-08-20 3 views
2

python의 $$ 변수와 비슷한 구문이 있습니까? 내가 실제로 시도하는 것은 값을 기반으로 모델을로드하는 것입니다.

예를 들어 값이 송이면 송 모듈을 가져오고 싶습니다. if 문이나 lambada를 사용할 수 있지만 php의 $$ 변수와 비슷한 점이 훨씬 편리하다는 것을 알고 있습니다.

내가 무엇을했는지는 이와 비슷합니다. 뷰

def xyz(request): 
    xz = [*variable].objects.all() 

*

변수 다음

from mypackage.models import [*variable] 

는 설정에 정의되거나 comandline에서 올 수있는 값이다. 프로젝트의 모든 모델이 될 수 있습니다.

답변

3
def load_module_attr (path): 
    modname, attr = path.rsplit ('.', 1) 
    mod = __import__ (modname, {}, {}, [attr]) 
    return getattr (mod, attr) 

def my_view (request): 
    model_name = "myapp.models.Song" # Get from command line, user, wherever 
    model = load_module_attr (model_name) 
    print model.objects.all() 
+0

내 질문을 이해하는 경우 확실하지 않습니다. 내가 성취하려고하는 것은 이것과 비슷한 것이다. *이 변수가 설정하거나 정의되는 값이다 XZ = 가변 *] .objects.all()에서 mypackage.models 는 [* 변수 상기 뷰 다음 DEF XYZ (요청) 가져 comandline에서 올 수 있습니다. 프로젝트의 모든 모델이 될 수 있습니다. 그래서 당신의 방법은 그 문제에 정말로 도움이되지 않습니다. – Mohamed

+0

코드를 업데이트했습니다. 문제에 더 가깝습니까? –

+0

아직 테스트하지는 않았지만 문법적으로 솔루션처럼 보입니다. – Mohamed

1

위키 피 디아 항목에 여러 언어의 예를 볼 수 있습니다.

를 읽으십시오 :이 기능은 import 문에 의해 호출 docs.python.org: __import__

. import 문의 의미를 변경하기 위해 (builtins 모듈을 가져 와서 builtins.__import__에 대입하여) 대체 할 수 있습니다. 그러나 요즘 가져 오기 훅을 사용하는 것이 일반적으로 더 간단합니다 (PEP 302 참조). __import__()의 직접 사용은 드물지만 런타임시 이름 만 알려진 모듈을 가져 오려는 경우는 예외입니다.

1

잠재적으로 일치하는 모듈/모델을 모두로드하고 요청에 따라 사용하려는 특정 모듈/모델을 선택하는 것 같습니다. 문자열로 인덱싱 할 수있는 전역 수준 변수 사전을 반환하는 "globals()"를 사용할 수 있습니다. 그래서 당신이 globals() [ 'Song']와 같은 것을하면, 그것은 당신에게 Song 모델을 줄 것입니다. 이것은 전역 범위의 변수 만 잡을뿐 아니라 PHP의 $$와 매우 비슷합니다. 로컬 범위의 경우 locals()를 호출해야합니다.

다음은 몇 가지 예제 코드입니다.

from models import Song, Lyrics, Composers, BlaBla 

def xyz(request): 
    try: 
     modelname = get_model_name_somehow(request): 
     model =globals()[modelname] 
     model.objects.all() 
    except KeyError: 
     pass # Model/Module not loaded ... handle it the way you want to 
관련 문제