2010-05-08 7 views
0

가져 오기 전까지 원하는 방식으로 작동하는이 코드 (Reset.py)가 있습니다. 가져 오지 않고가져 오기를 사용하여 전역 재설정

class Res(object): 
    defaults={} 
    class NoKey: pass 
    def __init__(self): 
     for key, values in defaults.items(): 
      globals()[key]=values 
    def add_defaults(key, values): 
     Res.defaults[key]=value 
    def remove_defaults(key=NoKey, remove_all=False): 
     if remove_all: 
      Res.defaults={} 
     else: 
      del Res.defaults[key] 

:

>>> a=54 
>>> Res.add_default('a', 3) 
>>> Res() 
<__main__.Res object at 0x> 
>>> a 
3 
>>> #great! :D 

오기로 : 이것은 __main__를 재설정 아래에 전역()을 변경하지 가져올 때 의미합니다

>>> a=54 
>>> Res.add_default('a', 3) 
>>> Res() 
<Reset.Res object at 0x> 
>>> a 
54 

. 이 문제를 어떻게 해결할 수 있습니까?

[remove_defaults에서 Res.defaults에 편집 디폴트 (기본값은 전역 변수 아니었다).]

답변

2

당신이 해결되지 않은 : 그것은 깨진되지 않습니다. 다른 모듈의 네임 스페이스 내에서 전역 적으로 돌연변이를 일으키는 전역을 돌연변이시키는 것은 매우 혼란스럽고 유지가 불가능한 테스트 할 수없는 코드로 이어지는 아주 나쁜 생각입니다.

디자인이 정말 혼란스러워 보입니다. Res doens't는 정말로 수업 인 것처럼 보인다. 대부분의 메소드는 메소드가 아닙니다 (자기 자신에 저장된 일부 상태를 변경하지 않고 있습니다). 메소드처럼 정의 된 유일한 것은 __init__이며 작동하지 않습니다 (defaults은 주어진 스 니펫에서 정의되어서는 안되며 클래스 네임 스페이스는 클래스의 원래 정의 중에 만 조회합니다.) 다른 것이 있습니까? , defaults라는 글로벌 이름이 붙어 있습니다.) Res을 사용하여 관련 항목을 그룹화하려는 경우 해당 클래스를 사용하지 마십시오. 그것이 파이썬에서 모듈을위한 것입니다.

아마 당신은 당신이 해결하고있는 문제를 설명하는 질문을 게시해야합니다. 나는이 코드가 매우 차선책 인 것으로 생각한다.

+0

가능한지 알고 싶었지만 귀하의 요지를 보았습니다. 고맙습니다. – what

+0

짧은 대답은 아니오입니다. 메서드는 호출되는 모듈을 알지 못합니다. 실제로, 매우 개념을 정확하게 정의하는 것이 어렵습니다. –

관련 문제