Python eval()
および/またはexec()
を使用して、ファイルまたはデータベースにデータを書き込まずにプログラムを実行する間の状態を維持する方法はありますか。 これは具体的に質問です。私は数値を出力し、ファイルやデータベースに変数を永続させることなく、それが再び実行されるたびに1を加え続けるプログラムを書こうとしています。 私は最近のインタビューでこの質問をしました。 助けていただければ幸いです。Python eval()とexec()
答えて
免責事項:私はではありませんこれを行うことをお勧めします。 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)
大量のデータを持っている場合でも、本格的なデータベースです。
これは優れています最初の選択肢は、インタビュアーが念頭に置いていたものだと思います。それは複雑ですが、それでも解決策です。 – Stacker
これは理想的にはコードゴルフですが、楽しいものでした。
要求通りにexec
とeval
を使用して解決します。
コードは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
ああいいね。私はこれが私の心にもっとも近いものだと思う。 – Stacker
あなたは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
- 1. eval execを実行するときにBashの子プロセスが親をkillする
- 2. Pythonは:/ evalのコンパイル
- 3. PHPとPythonのサーバーページとセッションとEXEC
- 4. DjangoのPythonのevalの
- 5. Pythonのsshでexec sudoコマンド
- 6. Eval()と式コード
- 7. ASP:LinkButtonとEval
- 8. JSON.parseとeval()
- 9. Pythonの意志のevalない()コード
- 10. python-py-expression-eval - numpy ndarrayを渡す
- 11. Evalとhref属性?
- 12. fork()、execとwaitpid()
- 13. Python execでglobalsを使用する
- 14. python - OSError:[Errno 8] Exec形式のエラー
- 15. パイプ制御付きのPython execコマンド
- 16. マーシャリングされたコードオブジェクトのPython exec()
- 17. PHP execのpythonが動作しない
- 18. Python exec()が動作しない
- 19. Pythonのexecと評価がコンパイルされた場合は?
- 20. Jythonの名前の競合:java.lang.Runtime.execとPythonのexec
- 21. exec()とPythonスクリプトに渡す変数の問題
- 22. GroovyはPythonのexec文と同じですか?
- 23. Python 3 - exec()から値を返すことが必要
- 24. 'child_process'.execと.spawn ENOENT
- 25. ループ内のevalとsetTimeout
- 26. Eval()とExpression Treeの比較
- 27. テキストラベルプロパティASP.Netのevalとアンカータグhref
- 28. Node.JS vm.runInNewContext()vs require()とeval()
- 29. AH01215:(8)Exec形式のエラー:execの '/var/www/python/hello.py'が失敗しました:/var/www/python/hello.py
- 30. Exec(cdとls)とフォークコールC
号は、なぜあなたはそれらはあなたを助けると思うだろうか? 'eval'と' exec'には、それらに関連した魔法の永続的ストレージがありません。 – user2357112
インタビュアーは具体的にevalとexecを使ってこれを行う方法を尋ねましたか、あるいは彼は単に州全体をどのように管理するかを尋ねましたか?あなた自身がeval/execを使う考えを思いつきましたか? – Kevin
それはインタビュー中に私に提供されたヒントの一部でした。どうやらevalはコードを自己修正するために何とか使うことができます。 – Stacker