2013-06-30 3 views
3

나는 정말 필요하지 않는 한 execeval을 사용하지 말아야한다는 것을 읽었습니다. 그래서 다음과 같은 경우가 유효한지 궁금 해서요. 만약 그렇지 않다면, 대신 무엇을 사용할 수 있을까요? ?exec의 사용에 관해서는

Npc 클래스의 메소드에서 변수를 Place 클래스의 인스턴스에서 변경해야합니다. 이처럼 :

Npc.move(self,destination)에서 :

exec "%s.matrix[self.position[0]][self.position[1]] = False" % (self.place) 

경우 self.place NPC가 "입니다"는 Place instace의 이름입니다. 예를 들어, 실행될 때 줄 수있는 :

내가 생각할 수있는 어떤
bedroom.matrix[0][0] = False 

입니다 : (False로 위치를 설정) 그렇게하기 위해 Place 클래스의 메소드를 만듭니다. 그러나 그렇게하는 것이 정말 낫습니까? 그렇게하면 한 번만 사용되는 한 줄짜리 함수가 생깁니다.

는 또한 외부 메소드를 호출 exec을 사용 :

def save(self): 
    """ 
    Saves the object instance to the database. 
    """ 
    exec "sql.routines.%s.add(self)" % (self.__type__) 

__type__Place, Npc 할 수있다, 등등 ... 나는 if 's의 무리를 사용할 수 알지만, 어디 .. 그렇게하는 것이 정말 낫습니까? 나는 여기서 "위험"을 볼 수없는 것 같아.

답변

4

Place의 문자열 이름을 0에 저장하지 말고은 Place 클래스의 인스턴스를 저장하고 해당 인스턴스를 직접 호출합니다.

class Npc: 
    def __init__(self, place): 
     self.place = place 

    def move(self, destination): 
     self.place.matrix[self.position[0]][self.position[1]] = False   
     ... 

place = SomePlace() 
npc = Npc(place) 
npc.move("foo") 
npc.place = SomeOtherPlace() 
npc.move("bar") 

두 번째 예는 거의 확실 또한이 sql.routines 코드의 세부 사항없이 (내가 instanceof를 사용하는 것보다이 일반적인 add 방법처럼 보일 수도 상상 어떻게 말을하는 것은 불가능하지만 exec의 사용을 배제하도록 재 설계 할 수 필요한 경우 유형을 전문으로 함).

그렇지 않으면 강력한 이유가없는 한 sqlalchemy과 같은 기존 sql 라이브러리를 사용하는 것이 좋습니다.

2

그 중 어느 것도이 객실은

rooms['bedroom'] = matrix 
rooms['yard'] = matrix... 

다음과 같은 더 좋을 수 저장

rooms[self.place][self.position[0]][self.position[1]] = false 

같은 것을 할 객체를 가진 BT 훨씬 더 할 수있는 첫 번째 평가 사용하기 좋은 사용 사례입니다

getattr(sql.routines,self.type).add(self)