Python에서 변수 체크

eminency의 이미지

취미로 Python을 가끔씩 하는데 맨날 C만 만지다보니 적응이 잘 안되네요 -_-;

다들 아시다시피 파이썬은 변수 선언을 하지 않는데요, 바보같은 질문인지도 모르겠습니다만 변수가 선언되어 있는지를 체크할 수 있는 함수가 혹시 있나요? -_-

예를 들면 'class'라는 클래스의 인스턴스가 만들어져 있지 않으면 그 인스턴스를 만들어 주려 하는데요. argv로 정보가 들어오면 프로그램 시작시에 인스턴스를 만들어주고, 아니면 커맨드라인 인터페이스로 정보를 받아 인스턴스를 만들어 주기 위함입니다.

즉...

 if ???(f):
  f = class(info)

이런 식으로 해주고 싶은데 ???에 들어갈 함수가 있나요? 아마 없을 것 같지만... 아니면 다른 방법이라도...

NameError인가? 이 예외를 처리하는 방법도 가능하겠지만 일일이 하려니 이것도 만만치 않아서...ㅡ.ㅡ;;

monpetit의 이미지

if 'f' not in globals().keys():
    f = class(info)

이 정도면 안 되나요?
bluemoon의 이미지

isinstance 를 쓰면 될텐데..

용도가 좀 틀리려나.. :?:

eminency의 이미지

monpetit wrote:
if 'f' not in globals().keys():
    f = class(info)

이 정도면 안 되나요?

아, globals()란 함수가 있는 줄은 몰랐습니다. 감사합니다.

isinstance도 첨 알았는데... 유용히 쓰겠습니다...(_ _)

노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5

crimsoncream의 이미지

질문하신 것과는 좀 다르지만 변수의 존재여부를 조사하는데는 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:

오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

nohmad의 이미지

crimsoncream wrote:
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:

왜 사용해선 안되는지 여쭤봐도 될까요?

crimsoncream의 이미지

  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 = theclass()
  c2.printt()
  c2.printu()

실행시켜 보시면 c2.printu()에서
AttributeError: theclass instance has no attribute 'u'

가 발생할 겁니다. u는 class theclass에 정의되지 않았고 runtime에 instance c에 생성되었으므로 다른 theclass의 instance들은 u를 가지고 있지 않으니까요.

뭐 이런 trick이 가능은 하지만 사용하면 안된다는 그냥 그런 얘기였습니다.

오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.