2013-09-03 15 views
24

Chciałbym przekazać operatorowi matematyczne wraz z wartościami numerycznymi do porównania funkcję. Oto mój złamany kod:Jak przekazać operatora do funkcji Pythona?

def get_truth(inp,relate,cut):  
    if inp print(relate) cut: 
     return True 
    else: 
     return False 

i nazywają go

get_truth(1.0,'>',0.0) 

która powinna zwracać wartość true.

Odpowiedz

37

Wystarczy popatrzeć na 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

W końcu, po prostu pozbył mojej funkcji i używane operatora. 'if operator.gt (1.0.0.0):' – philshem

+0

Nie możesz po prostu użyć 'if 1.0> 0.0:'? – grc

+0

Chcę móc dynamicznie zmieniać operatora (może więc będę musiał wrócić do rozwiązania funkcji). – philshem

10

Użyj modułu operator. Zawiera wszystkie standardowe operatory, których można używać w pythonie. Następnie użyć operatora jako funkcji:

import operator 

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

get_truth(1.0, operator.gt, 0.0) 

Jeśli naprawdę chcesz używać jako ciągi operatorów, a następnie utworzyć słownika mapowanie z ciągiem do funkcji operatora jako @alecxe sugerowane.

-3

chcesz użyć eval:

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

Nie, nie. Naprawdę, wcale nie musisz używać 'eval()'. –

+0

OP chce użyć ''<'', więc dlaczego tak jest "Nie, ty nie ..."? –

+0

Jest wiele dobrych odpowiedzi, ale przyjmuję to (kiedy mogę), ponieważ nie korzysta z bibliotek zewnętrznych. Jaki jest powód, aby nie używać eval()? – philshem

22

dokonać mapowania smyczki i operator funkcji. Ponadto, nie trzeba jeśli/stan innego:

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() jest zła: Is using eval in Python a bad practice?

+2

+1. Ponadto ta odpowiedź pokazuje, że możesz bezpośrednio zwrócić wartość 'ops [relate]', zamiast jawnie testować ją i zwracać dosłowne 'True' lub' False'. – 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

Nie, proszę nie używać 'eval()', gdy dostępne są lepsze rozwiązania. –

+0

jaki jest twój problem z eval ??? Zatrudniasz wszystkich, którzy dali działające rozwiązanie, które używa eval – amadain

+2

'eval()' stanowi zagrożenie bezpieczeństwa i jest nadużywane jako "rozwiązanie", gdy ludzie nie wiedzą, że istnieje lepsza opcja. –

Powiązane problemy