Python에서 변수 체크
글쓴이: eminency / 작성시간: 화, 2003/07/29 - 12:05오전
취미로 Python을 가끔씩 하는데 맨날 C만 만지다보니 적응이 잘 안되네요 -_-;
다들 아시다시피 파이썬은 변수 선언을 하지 않는데요, 바보같은 질문인지도 모르겠습니다만 변수가 선언되어 있는지를 체크할 수 있는 함수가 혹시 있나요? -_-
예를 들면 'class'라는 클래스의 인스턴스가 만들어져 있지 않으면 그 인스턴스를 만들어 주려 하는데요. argv로 정보가 들어오면 프로그램 시작시에 인스턴스를 만들어주고, 아니면 커맨드라인 인터페이스로 정보를 받아 인스턴스를 만들어 주기 위함입니다.
즉...
if ???(f): f = class(info)
이런 식으로 해주고 싶은데 ???에 들어갈 함수가 있나요? 아마 없을 것 같지만... 아니면 다른 방법이라도...
NameError인가? 이 예외를 처리하는 방법도 가능하겠지만 일일이 하려니 이것도 만만치 않아서...ㅡ.ㅡ;;
Forums:


[code:1]if 'f' not in globals().
if 'f' not in globals().keys(): f = class(info)이 정도면 안 되나요?
-----
http://monpetit.posterous.com/
http://monpetit.tistory.com/
그건요..
isinstance 를 쓰면 될텐데..
용도가 좀 틀리려나.. :?:
[quote="monpetit"][code:1]if 'f' not in
아, globals()란 함수가 있는 줄은 몰랐습니다. 감사합니다.
isinstance도 첨 알았는데... 유용히 쓰겠습니다...(_ _)
노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5
질문하신 것과는 좀 다르지만 변수의 존재여부를 조사하는데는 globals
질문하신 것과는 좀 다르지만 변수의 존재여부를 조사하는데는 globals와 함께 locals나 dir도 함께 쓰시면 유용하실 겁니다.
locals는 globals와 똑같이 dict 형태로 local namespace를 보여주는 거구요.
dir의 경우는 class, instance, module에 쓰시면 됩니다.
class theclass: def __init__(self): self.s = 'Hello World !' def printt(self): print self.s def info(self): t = 'local hero' print 'globals in theclass:\n%s\n' % globals() print 'locals in theclass:\n%s\n' % locals() if (__name__ == '__main__'): print 'globals in __main__:\n%s\n' % globals() print 'locals in __main__:\n%s\n' % locals() c = theclass() c.printt() print c.info() print 'dir of the class:\n%s\n' % dir (theclass) print 'dir of the instance:\n%s\n' % dir (c) print "Now you enter the darkside of Python :)" c.u = "What's up !?" def f (some): print some.u theclass.printu = f print 'dir of the class:\n%s\n' % dir (theclass) print 'dir of the instance:\n%s\n' % dir (c) c.printu()이 코드를 실행시켜 보면
$ python theclass.py globals in __main__: {'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__d oc__': None, 'theclass': <class __main__.theclass at 0x10110fc0>} locals in __main__: {'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__d oc__': None, 'theclass': <class __main__.theclass at 0x10110fc0>} Hello World ! globals in theclass: {'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', 'c': <__main__.theclass instance at 0x100c5d08>, '__doc__': None, 'theclass': <class __main__.theclass at 0x10110fc0>} locals in theclass: {'self': <__main__.theclass instance at 0x100c5d08>, 't': 'local hero'} dir of the class: ['__doc__', '__init__', '__module__', 'info', 'printt'] dir of the instance: ['__doc__', '__init__', '__module__', 'info', 'printt', 's'] Now you enter the darkside of Python :) dir of the class: ['__doc__', '__init__', '__module__', 'info', 'printt', 'printu'] dir of the instance: ['__doc__', '__init__', '__module__', 'info', 'printt', 'printu', 's', 'u'] What's up !?이런 식이 됩니다. 끝부분은 사용해서는 안될 python의 어두운 측면
:wink:
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.
...
왜 사용해선 안되는지 여쭤봐도 될까요?
----
http://nohmad.tumblr.com/
[code:1] print "Now you enter th
print "Now you enter the darkside of Python :)" c.u = "What's up !?" def f (some): print some.u theclass.printu = f print 'dir of the class:\n%s\n' % dir (theclass) print 'dir of the instance:\n%s\n' % dir (c) c.printu()요부분이 그 출력에 해당하는 소스인데요.
요기에 이어서
실행시켜 보시면 c2.printu()에서
가 발생할 겁니다. u는 class theclass에 정의되지 않았고 runtime에 instance c에 생성되었으므로 다른 theclass의 instance들은 u를 가지고 있지 않으니까요.
뭐 이런 trick이 가능은 하지만 사용하면 안된다는 그냥 그런 얘기였습니다.
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.