(Eğer üretime böyle bir kod koymadan önce sonundaki varsayılan güvenlik uyarısı bakın!)
diğer cevaplar exec
ve eval
arasındaki farkı açıklayan iyi bir iş yapmak.
Yine de kendimi kuvvet insanlar yazmak için yerine x=1; y=2; x+y
gibi girdi almak isteyen bulundu: kodun
def f():
x = 1
y = 2
return x + y
dize manipülasyon işlevi bu tür inşa etmek riskli bir iştir.
Ben aşağıdaki yaklaşımı kullanarak sona erdi:
def multiline_eval(expr, context):
"Evaluate several lines of input, returning the result of the last line"
tree = ast.parse(expr)
eval_expr = ast.Expression(tree.body[-1].value)
exec_expr = ast.Module(tree.body[:-1])
exec(compile(exec_expr, 'file', 'exec'), context)
return eval(compile(eval_expr, 'file', 'eval'), context)
Bu piton kodunu ayrıştırır; Son satırdan ayrı bir şeyleri yeniden inşa etmek için ast kütüphanesini kullanır; ve son satır, eskiyi yürütmek ve daha sonra değerlendirmek.
Bu eval
eklemek zorunda zorunlu güvenlik uyarısıdır Güvenlik uyarısı. Ayrıcalıklı olmayan bir kullanıcı tarafından sağlananEval
've exec
' kodları elbette güvensizdir. Bu durumlarda başka bir yaklaşım kullanmayı veya ast.literal_eval'ı kullanmayı tercih edebilirsiniz.ve exec
, kullanıcılarınıza gerçek anlamda python'un tam ifade gücünü vermek istemediğiniz sürece kötü fikirler olma eğilimindedir.
Hata. Cevabınız buradaydı! Bunu dupe olarak işaretlemeliyiz: P –
lol Tüm bunları unutmuştum: P –
Bunu http: // stackoverflow'dan yakaladım.com/questions/30671563/eval-not-not-working-on-multi-line-string # comment49405263_30671563: D –