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()
에서 최종 사용자 입력을 사용하지 않으므로 "안전한"것으로 보인다.)
이 사용법은'globals() [self.inventory_type]'으로 바꿀 수 없습니까? –
eval (self.inventory_type)은 변수가 아닌 가져온 클래스 객체 (SQLObject 클래스의 하위 클래스)입니다. globals()는 선언 된 변수 만 표시합니까? 그리고 SQLObject.get은 모듈 이름을 가져 오거나 가져온 이름이'globals()'의 반환 값에 나타나는 경우 @classmethod – tkone
이 아닙니다. '>>> import os' /'>>> 'os'in globals()'/'True' –