2017-02-03 6 views
0

Python eval()および/またはexec()を使用して、ファイルまたはデータベースにデータを書き込まずにプログラムを実行する間の状態を維持する方法はありますか。 これは具体的に質問です。私は数値を出力し、ファイルやデータベースに変数を永続させることなく、それが再び実行されるたびに1を加え続けるプログラムを書こうとしています。 私は最近のインタビューでこの質問をしました。 助けていただければ幸いです。Python eval()とexec()

+0

号は、なぜあなたはそれらはあなたを助けると思うだろうか? 'eval'と' exec'には、それらに関連した魔法の永続的ストレージがありません。 – user2357112

+0

インタビュアーは具体的にevalとexecを使ってこれを行う方法を尋ねましたか、あるいは彼は単に州全体をどのように管理するかを尋ねましたか?あなた自身がeval/execを使う考えを思いつきましたか? – Kevin

+0

それはインタビュー中に私に提供されたヒントの一部でした。どうやらevalはコードを自己修正するために何とか使うことができます。 – Stacker

答えて

1

免責事項:私はではありませんこれを行うことをお勧めします。 99.999%の時間で、シリアライズ可能な情報を独自のファイルに保存することをお勧めします。

にデータを書き込むことなく、独自のファイル」、あなたは意味、 を「ファイルにデータを書き込むことなく、」あなたが実行されているPythonのファイルを開くことができますし、その場でデータを書き換えることであれば:

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)を実行するの.pyファイル
に加え、どの印刷されること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 
関連する問題