2013-09-03 30 views

Trả lời

37

Có một cái nhìn tại operator module:

import operator 
get_truth(1.0, operator.gt, 0.0) 

... 

def get_truth(inp, relate, cut):  
    return relate(inp, cut) 
    # you don't actually need an if statement here 
+0

Cuối cùng, tôi chỉ đã thoát khỏi chức năng của tôi và điều hành sử dụng. 'if operator.gt (1.0,0.0):' – philshem

+0

Bạn không thể sử dụng 'if 1.0> 0.0:'? – grc

+0

Tôi muốn có thể thay đổi toán tử động (vì vậy tôi có thể phải quay lại giải pháp hàm). – philshem

10

Sử dụng mô-đun operator. Nó chứa tất cả các toán tử chuẩn mà bạn có thể sử dụng trong python. Sau đó, sử dụng toán tử làm hàm:

import operator 

def get_truth(inp, op, cut): 
    return op(inp, cut): 

get_truth(1.0, operator.gt, 0.0) 

Nếu bạn thực sự muốn sử dụng chuỗi làm toán tử, hãy tạo ánh xạ từ điển từ chuỗi đến hàm toán tử như @alecxe được đề xuất.

-3

Bạn muốn sử dụng eval:

if eval(str(inp) + relate + str(cut)):` 
+4

Không, bạn không cần. Thực sự, bạn không cần phải sử dụng 'eval()' ở đây. –

+0

OP muốn sử dụng '' <''vậy tại sao" Không, bạn không ... "? –

+0

Có nhiều câu trả lời hay nhưng tôi sẽ chấp nhận điều này (khi tôi có thể) vì nó không sử dụng thư viện bên ngoài. Lý do để không sử dụng eval() là gì? – philshem

22

Thực hiện một bản đồ của chuỗi và operator chức năng. Ngoài ra, bạn không cần điều kiện if/else:

import operator 


def get_truth(inp, relate, cut): 
    ops = {'>': operator.gt, 
      '<': operator.lt, 
      '>=': operator.ge, 
      '<=': operator.le, 
      '=': operator.eq} 
    return ops[relate](inp, cut) 


print get_truth(1.0, '>', 0.0) # prints True 
print get_truth(1.0, '<', 0.0) # prints False 
print get_truth(1.0, '>=', 0.0) # prints True 
print get_truth(1.0, '<=', 0.0) # prints False 
print get_truth(1.0, '=', 0.0) # prints False 

FYI, eval() là ác: Is using eval in Python a bad practice?

+2

+1. Ngoài ra, câu trả lời này chứng minh rằng bạn có thể trả về trực tiếp giá trị của 'ops [relate]', thay vì kiểm tra một cách rõ ràng và trả về một 'True' hoặc' False' theo nghĩa đen. – chepner

-2
>>> def get_truth(inp,relate,cut): 
...  if eval("%s%s%s" % (inp,relate,cut)): 
...   return True 
...  else: 
...   return False 
... 
>>> get_truth(1.0,'>',0.0) 
True 
>>> 
+3

Không, vui lòng không sử dụng 'eval()' khi có giải pháp tốt hơn. –

+0

vấn đề của bạn với eval là gì ??? Bạn đang downvoting tất cả những người đã đưa ra một giải pháp làm việc sử dụng eval – amadain

+2

'eval()' đặt ra một nguy cơ bảo mật, và là cách lạm dụng như là một 'giải pháp' bất cứ khi nào mọi người không biết một lựa chọn tốt hơn tồn tại. –

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