문제

동적으로 생성 된 문자열을 사용하고 "Pigeon"이라고 말하고 런타임 에이 프로젝트에 "Pigeon"이라는이 프로젝트에 정의 된 모델 클래스가 있는지 여부를 결정하고 싶습니다. "Pigeon"이 존재하는 모델 클래스의 이름 인 경우, 비둘기 클래스에 대한 참조를 원합니다.

또한이 경우 동적 문자열 "비둘기"가 외부에서 나오기 때문에 Eval을 전혀 사용하고 싶지 않습니다.

도움이 되었습니까?

해결책

내부 세부 사항에 의존하지 않고이 작업을 수행하는 두 가지 쉬운 방법이 있습니다.

Google.appengine.api.datastore API를 사용하십시오.

from google.appengine.api import datastore

q = datastore.Query('EntityType')
if q.get(1):
  print "EntityType exists!"

다른 옵션은 db.expando 클래스를 사용하는 것입니다.

def GetEntityClass(entity_type):
  class Entity(db.Expando):
    @classmethod
    def kind(cls):
      return entity_type
  return Entity

cls = GetEntityClass('EntityType')
if cls.all().get():
  print "EntityType exists!"

후자는 GetEntityClass를 사용하여 모든 엔티티 유형에 대한 Expando 클래스를 생성하고 일반 클래스와 같은 방식으로 상호 작용할 수 있다는 이점이 있습니다.

다른 팁

아마도 매우 나쁜 연습을 시도 할 수 있습니다.

def get_class_instance(nm) :
    try :
        return eval(nm+'()')
    except :
        return None

또한 더 안전하게 만들기 위해 현지인들에게 해시를 평가할 수 있습니다. eval(nm+'()', {'Pigeon':pigeon})

그것이 작동하는지 확실하지 않으며, 확실히 문제가 있습니다. 값이라는 함수가 있다면 nm, 그것은 그것을 반환 할 것입니다 :

def Pigeon() :
    return "Pigeon"
print(get_class_instance('Pigeon')) # >> 'Pigeon'

편집하다: 모듈을 알고 있다면 또 다른 방법은 다음과 같습니다.
(죄송합니다, 나는 그것이 obj.hasattr, hasattr (obj)가 아니라는 것을 잊어 버렸습니다!)

import models as m
def get_class_instance(nm) :
    if hasattr(m, nm) :
        return getattr(m, nm)()
    else : return None

편집 2: 네, 작동합니다! 우호!

실제로, 소스 코드와 Web를 살펴보면, 나는 법안에 맞는 것처럼 보이는 문서화되지 않은 방법을 발견했습니다.

from google.appengine.ext import db

key = "ModelObject" #This is a dynamically generated string

klass = db.class_for_kind(key)

이 방법은 클래스가 존재하지 않으면 설명적인 예외를 던지므로 열쇠 문자열이 외부에서 나오면 잡아야 할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top