2012-05-14 41 views
5

Tôi có biểu thức boolean trong một chuỗi. ví dụ. . Có một cách đơn giản để phân tích và đánh giá chuỗi này để nó sẽ trả về True (trong trường hợp này).kiểm tra biểu thức boolean trong chuỗi Python

ast.literal_eval("20 < 30") không hoạt động.

Trả lời

2
>>> eval("20<30") 
True 
+1

Cảm ơn bạn đã quên mất một số – RickyA

2

Đây có phải là chuỗi do người dùng xác định hoặc chuỗi bạn đang xác định không?

Nếu đó là một chuỗi bạn đang tạo, bạn có thể sử dụng eval (eval("20 < 30")), nhưng nếu chuỗi được đưa ra bởi người sử dụng, bạn có thể muốn để khử trùng nó đầu tiên ...

+2

Tôi tạo nó. Đừng lo lắng :) Đánh giá thực sự là một lỗ hổng bảo mật rất tốt đẹp và rất lớn. – RickyA

0

ast.literal_eval không nên làm việc kể từ (từ tài liệu) "Chuỗi hoặc nút được cung cấp chỉ có thể bao gồm các cấu trúc chữ viết Python sau: chuỗi, số, tuples, danh sách, dicts, booleans và None." Biểu thức 20<30 yêu cầu một số loại đánh giá, trước khi nó trả về a bool.

Đề xuất an toàn hơn là chia chuỗi trên toán tử và literal_eval mỗi bên trước khi chuyển đến eval, tức là.

import ast 

expr = "20 < 30" 
operator = "<" 
lhs,rhs = map(ast.literal_eval, map(str.strip, expr.split(operator))) 
eval("%s %s %s"%(lhs,operator,rhs)) 

Bao bì các điều trong một điều khoản try, except sẽ bắt đầu vào một số lỗi khi đánh giá lhs,rhs.

Các vấn đề liên quan