본문 바로가기
Python/파이썬 기초

eval(), exec(), compile() 내장함수 - 파이썬 기초(13)

by 콩돌 2018. 12. 18.
반응형


참고 자료

https://docs.python.org/3/library/functions.html



파이썬 버전 3.7 기준



텍스트 실행과 관련된 내장함수


본 포스팅에서 다루는 함수는 다음과 같다.

eval(), exec(), complie() 등.



eval(expression, globals=None, locals=None)

  ○ expression에는 변수가 포함된 표현식(함수, 연산자이용)이 문자열 형태(string, str)로 입력받는다. 

    ▷ 즉, 굳이 표현식을 문자열로 입력하고 싶은 경우에 사용하면 된다.

  ○ 이 함수는 표현식(expression)의 결과를 반환한다. 

    ▷ 따라서, 식만 입력된다. 즉 'x=4+5'와 같은 문장은 에러를 일으킨다.

    ▷ 문자열을 파이썬 함수로 치환하는 과정을 거치기 때문에 과도하게 이 함수의 사용하면 코드 실행을 느려지게 할 수 있다.


사용 예)

In[19]: x = eval('5+5')

In[20]: x

Out[20]: 10


In[21]: y = eval('x+5')

In[22]: y

Out[22]: 15


In[23]: eval('1+1')

Out[23]: 2


In[24]: a = 'ex'

In[25]: eval('repr(a)')

Out[25]: "'ex'"

In[26]: eval('rere(a)', {'rere': repr, 'a': 'kk'})

Out[26]: "'kk'"



exec(object[, globals[, locals]])

  ○ 이 함수는 파이썬 코드를 동적 실행을 지원하게 한다.

  ○ object는 문자열 또는 코드 객체(complie()함수로 컴파일된 객체)어야 한다. 
    ▷ eval과는 다르게 문장 자체를 입력 받는다. 즉, 'x=4+5'이 가능하며, 이 함수에서는 값 자체를 반환하지 않는다.

    ▷ 즉, 코드의 한줄을 문자열 혹은 코드로 입력받는다고 생각하면 된다. 


사용 예)

In[49]: exec("one=1+9+pow(2,2)")

In[50]: one

Out[50]: 14


In[51]: kk={"pw": pow, 'a': 0}

In[52]: exec("a=pw(3,3)", kk)

In[53]: kk['a']

Out[53]: 27



compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)

  ○ source를 코드 또는 AST 객체로 컴파일한다. 

    ▷ source는 일반 문자열, 바이트열 또는 AST 객체가 입력이 가능하다. 

    ▷ 컴파일된 객체는 exec()나 eval()로 실행이 가능하다. 

  ○ filename은 코드를 읽은 파일을 넣는다. 
    ▷ 파일이 아니라 코드 자체에서 읽는 경우는 인식 가능한 값을 넣는데 주로 <string>을 입력한다. 
  ○ mode 인자는 컴파일 하는 코드의 종류를 지정한다. 
    ▷ 입력받는 source가 문장형태(예: 'x=4+9')이면 'exec'를 입력하면되고, 
    ▷ 표현식 형태(예: '9+3')라면 'eval'를 입력하면된다. 
    ▷ 단일 대화형으로 구성되는 경우는 'single'도 입력 가능하다.
  ○ 그 외에 flags나 dont_ingerit 인자를 통해 컴파일을 제어할 수 있고, optimize인자를 통해 컴파일러의 최적화 수준을 지정할 수 있다. 

사용 예)
In[15]: ex1 = "pow(2,4)"
In[16]: com1=compile(ex1,"<string>", 'eval')
In[17]: res1=eval(com1)
In[18]: res1
Out[18]: 16

In[19]: ex2="x=pow(2,4)"
In[20]: com2=compile(ex2, '<string>', 'exec')
In[21]: exec(com2)
In[22]: x
Out[22]: 16


반응형

댓글