2012-10-29 4 views
2

pygame을 사용하여 Python으로 작성된 내 드로잉 프로그램의 사용자가 선택한 객체의 이름을 바꾼 다음 해당 이름으로 실시간 인터프리터를 통해 액세스 할 수있게하려고합니다. 다음은 모든 드로어 블 객체의 기본 클래스의 메소드입니다. 이 코드를 실행하면 오류가 발생하지 않지만 새 이름을 사용하여 개체에 액세스하려고하면 해당 이름의 변수가 정의되지 않았다고 말합니다. 이것이 어떤 이유 일 수 있습니까? 나는 exec 함수가 전역 변수의 자신의 conecpt을 가지고 있기 때문에 그 작동합니다 생각하지 않습니다eval을 사용하여 전역 변수에서 새 변수 만들기

def rename(self,newName): 

    """ 
    Gives this drawable a new name by which the user my reference it in 
    code 
    """ 

    #Create a new variable in the global scope 
    command = 'global ' + newName + '\n' 

    #Tie it to me 
    command += newName + ' = self' + '\n' 

    #If I already had a name, I'll remove this reference 
    if self.name != None: 
     command += 'del ' + self.name 

    #Execute the command 
    exec(command) 

    #Make this adjustment internally 
    self.name = newName 

답변

2

는 하나의 독립적 인 함수는보고있다.

일반적으로 말해서 모듈 사전을 조작하는 것이 더 쉽습니다. 전역 범위는 실제로 현재 모듈의 멤버 이름입니다. 당신이 __main__ 모듈을 사용하는 경우

예를 들어, 변수 추가 :

sys.modules['__main__'].__setattr__('xxx', 42) 

을 그리고 그것을 삭제 :

sys.modules['__main__'].__delattr__('xxx') 

UPDATE을 : 두 번째 생각에, 당신 돈 경우 모듈에 대해 신경 쓰지 마세요. globals() 사전을 사용하면 더 좋습니다. 변수 추가하려면 :

globals()['xxx'] = 42 

을 그리고 그것을 삭제 :

del globals()['xxx'] 

은 물론, 그 이전에 해당하기 때문에 (sys.modules[__name__].__dict__) 같은 globals() 반환 뭔가.

멋진. 결론은 다음과 같습니다. eval을 사용하여 리플렉션을 수행하면 잘못 처리하는 것입니다.

+0

이것은 나를 위해 일하는 것 같습니다. 도와 줘서 고마워, 로드리고! – hedgehogrider

+0

비록 exec가 작동하지 않는 이유는 아직도 이해하지 못합니다. exec (command, globals())에서도 작동하지 않았습니다. 이 문건은 내가 읽을 수있는 모든 문건입니까? – hedgehogrider

+0

Hmmmm, 일부 테스트 후에 다른 전역 변수를 사용하여'exec'에 대해 잘못된 것처럼 보입니다. 실제로, 어떤 간단한 경우는 저에게 효과적이었습니다 ...하지만 내게 충격을주는 것은 여러분이 삭제하기 전에''global '+ self.name''을 추가하지 않고 실패하지 않는다는 것입니다. 그래서 추측 컨대 당신이 그것을 삽입 한 직후 같은 이름! – rodrigo