2013-09-03 14 views
24

Mi piacerebbe passare un operatore matematico, insieme ai valori numerici da confrontare, a una funzione. Qui è il mio codice rotto:Come passare un operatore a una funzione python?

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

e chiamarlo con

get_truth(1.0,'>',0.0) 

che dovrebbe restituire True.

risposta

37

Date un'occhiata al 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

Alla fine, ho appena sono liberato della mia funzione e l'operatore utilizzato. 'if operator.gt (1.0,0.0):' – philshem

+0

Non potresti usare 'if 1.0> 0.0:'? – grc

+0

Voglio poter cambiare l'operatore in modo dinamico (quindi potrei dover tornare alla soluzione della funzione). – philshem

10

Utilizzare il modulo operator. Contiene tutti gli operatori standard che è possibile utilizzare in python. Quindi utilizzare l'operatore come un funzioni:

import operator 

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

get_truth(1.0, operator.gt, 0.0) 

Se davvero si vuole utilizzare stringhe come operatori, quindi creare una mappatura dizionario da stringa a funzione di operatore @alecxe suggerito.

-3

che si desidera utilizzare eval:

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

No, non lo fai. In realtà, non è necessario usare 'eval()' qui. –

+0

OP vuole usare ''<'' quindi perché è "No you not not ..."? –

+0

Ci sono molte buone risposte, ma accetterò questo (quando posso) perché non usa le librerie esterne. Qual è la ragione per non usare eval()? – philshem

22

Fai una mappatura delle stringhe e operator funzioni. Inoltre, non è necessario se/condizione 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 

Cordiali saluti, eval() è il male: Is using eval in Python a bad practice?

+2

+1. Inoltre, questa risposta dimostra che è possibile restituire direttamente il valore di 'ops [relate]', invece di testarlo esplicitamente e restituire un valore letterale 'True' o' 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

No, per favore non usare 'eval()' quando sono disponibili soluzioni migliori. –

+0

qual è il tuo problema con eval ??? Stai facendo downvoting a tutti coloro che hanno fornito una soluzione funzionante che utilizza eval – amadain

+2

'eval()' pone un rischio per la sicurezza ed è abusato come una 'soluzione' ogni volta che le persone non sanno che esiste un'opzione migliore. –

Problemi correlati