2017-02-03 1 views
0

파이썬 eval() 및/또는 exec()을 사용하여 파일이나 데이터베이스에 데이터를 쓰지 않고 프로그램 실행간에 상태를 유지할 수 있습니까? 여기에 더 구체적으로 질문이 있습니다. 숫자를 출력 한 다음 파일이나 데이터베이스에 변수를 저장하지 않고 다시 실행할 때마다 1을 계속 추가하는 프로그램을 작성하려고합니다. 최근 인터뷰에서이 질문을 받았습니다. 도움을 주시면 감사하겠습니다.Python eval() 및 exec()

+0

번호는 왜 그 당신을 도울 것이라고 생각? 'eval'과'exec'는 그들과 연관된 마술적인 영구 저장소를 가지고 있지 않습니다. – user2357112

+0

인터뷰 담당자가 구체적으로 eval과 exec를 사용하여이 작업을 수행하는 방법을 묻지 않았습니까? 아니면 일반적으로 상태를 유지하는 방법을 묻지 않았으며 eval/exec를 직접 사용하는 아이디어가 떠 올랐습니까? – Kevin

+0

그것은 인터뷰에서 나에게 제공되는 힌트의 일부입니다. 외관상으로는 eval는 코드를 스스로 수정하는 데 어떻게 든 사용될 수 있습니다. – Stacker

답변

1

면책 조항 : 나는 이 아닙니다.은 이것을 권장합니다. 99.999 %의 시간이면 직렬화 가능 정보를 자체 파일에 저장하는 것이 좋습니다.

"에 데이터를 작성하지 않고 자신의 파일", 뜻, 의 "파일에 데이터를 작성하지 않고"당신이 실행되고있는 파이썬 파일을 열 수에 적절한 데이터를 다시 작성하여 경우 :

import re 

x = 0 
print "The value of the variable x is: {}".format(x) 

with open("test.py") as file: 
    data = file.read() 

data = re.sub(r"x = (\d+)", "x = {}".format(x+1), data) 

with open("test.py", "w") as file: 
    file.write(data) 

이제 이후의 실행마다 값이 변경됩니다.

C:\Users\Kevin\Desktop>test.py 
The value of the variable x is: 0 

C:\Users\Kevin\Desktop>test.py 
The value of the variable x is: 1 

C:\Users\Kevin\Desktop>test.py 
The value of the variable x is: 2 

C:\Users\Kevin\Desktop>test.py 
The value of the variable x is: 3 

C:\Users\Kevin\Desktop>test.py 
The value of the variable x is: 4 

그러나 다시, 그냥 예를 shelve에 사용, 별도의 파일에 데이터를 유지하는 것이 바람직입니다 :

import shelve 

d = shelve.open("data.dat") 
if "x" not in d: 
    d["x"] = 0 

print "The value of x is: {}".format(d["x"]) 
d["x"] += 1 

또는 당신이 가치 있다면 아마도 JSON 인간 가독성 :

import json 

try: 
    with open("data.dat") as file: 
     d = json.load(file) 
except IOError: #first execution. file doesn't exist yet. 
    d = {"x":0} 

print "The value of x is: {}".format(d["x"]) 
d["x"] += 1 

with open("data.dat", "w") as file: 
    json.dump(d, file) 

많은 양의 데이터가있는 경우 본격적인 데이터베이스입니다.

+0

음 첫 번째 옵션은 면접자가 염두에 두었던 것입니다. 그것은 복잡하지만 여전히 솔루션입니다. – Stacker

1

이상적으로는 코드 골프 여야하지만 재미있었습니다!
요청하신대로 execeval을 사용하는 해결책은 다음과 같습니다.
코드는 15 개 라인 긴 각각 (z=1)는 평 파일에 추가됩니다 추가로 줄을 실행에
무엇을 인쇄하는 것은 number of lines in file now - 15, 각 실행에 따라서 인쇄 단위입니다

initial_num_lines = 15 
def get_lines_in_file(): 
    f = open('evalexec.py', 'r') 
    num_lines = len(f.readlines()) 
    return num_lines 

lines = str(get_lines_in_file() - initial_num_lines) 
print eval(lines+'+1') 
exec_code = ''' 
f = open('evalexec.py', 'a') 
f.write("\\nz=1") 
f.close() 
''' 
exec(exec_code) 

출력 :

>python evalexec.py 
0 

>python evalexec.py 
1 

>python evalexec.py 
2 

>python evalexec.py 
3 
+0

아 아 좋네. 나는 이것이 내가 염두에 두었던 것에 가장 가깝다고 생각한다. – Stacker

1
당신은 os.utime를 사용하여 마지막으로 수정 된 값을 추적 (정수이다) 유지하고, 그것을 각 실행을 업데이트 할 파일 stats을 사용할 수 있습니다

:

,
import os 

last_modified = os.stats(__file__).st_mtime 
print(int(last_modified)) 

os.utime(__file__, (last_modified, last_modified + 1)) 

연속 실행 :

Petes-Mac:~ petewood$ python inc.py 
1486149574 
Petes-Mac:~ petewood$ python inc.py 
1486149575 
Petes-Mac:~ petewood$ python inc.py 
1486149576