2011-12-12 1 views
1

OK.문자열을 기반으로 한 클래스를 만드는 더 파이썬적인 방법 (eval을 사용하지 않는 방법)

다른 파이썬 객체에 대한 참조를 저장하려는 데이터베이스가 있습니다. (지금은 맥주 제조법의 재료를 저장하는 인벤토리 정보를 저장하는 데 사용하고 있습니다).

약 15-20 개의 서로 다른 카테고리의 구성 요소 (모두 개별 SQLObject로 나타남)가 있기 때문에 관련 게인 열을 많이 사용하고 싶지 않습니다. 게으르다. "최고의"또는 "파이썬"솔루션입니다.

그래서 지금 내가이 일을 해요 :

class Inventory(SQLObject): 
    inventory_item_id = IntCol(default=0) 
    amount = DecimalCol(size=6, precision=2, default=0) 
    amount_units = IntCol(default=Measure.GM) 
    purchased_on = DateCol(default=datetime.now()) 
    purchased_from = UnicodeCol(default=None, length=256) 
    price = CurrencyCol(default=0) 
    notes = UnicodeCol(default=None) 
    inventory_type = UnicodeCol(default=None) 

    def _get_name(self): 
     return eval(self.inventory_type).get(self.inventory_item_id).name 

    def _set_inventory_item_id(self, value): 
     self.inventory_type = value.__class__.__name__ 
     self._SO_set_inventory_item_id(value.id) 

는 _get_name() 메소드에 구역질 eval()을 유의하시기 바랍니다.

eval()을 사용하지 않고 __class__.__name__에서 가져 오는 문자열로 참조되는 SQLObject 클래스를 호출하는 방법은 무엇입니까? 아니면 eval()을 활용할 수있는 적절한 곳입니까? (나는 결코 eval()을 사용하는 것이 적절하지 않은 사고 방식이다. 그러나 시스템은 결코 eval()에서 최종 사용자 입력을 사용하지 않으므로 "안전한"것으로 보인다.)

+0

이 사용법은'globals() [self.inventory_type]'으로 바꿀 수 없습니까? –

+0

eval (self.inventory_type)은 변수가 아닌 가져온 클래스 객체 (SQLObject 클래스의 하위 클래스)입니다. globals()는 선언 된 변수 만 표시합니까? 그리고 SQLObject.get은 모듈 이름을 가져 오거나 가져온 이름이'globals()'의 반환 값에 나타나는 경우 @classmethod – tkone

+1

이 아닙니다. '>>> import os' /'>>> 'os'in globals()'/'True' –

답변

3

이름; 사용 :

globals()[self.inventory_type] 
관련 문제