2009-11-16 10 views
17

Come posso trasformare una stringa come "+" nell'operatore plus? Grazie!Trasforma la stringa nell'operatore

+1

invece è possibile convertire le altre cose a stringa e valutare http : //stackoverflow.com/questions/729248/python-eval-and-globals – Xinus

risposta

56

Utilizzare una tabella di ricerca:

import operator 
ops = { "+": operator.add, "-": operator.sub } # etc. 

print ops["+"](1,1) # prints 2 
-12

È possibile utilizzare eval in questo modo:

eval("+") 
+5

questo causa l'errore di sintassi – Xinus

+2

è anche molto pericoloso utilizzare eval – Alvin

+1

"risposta" inutile che produce solo errori di sintassi, questo non è nemmeno notevole per mostrare il "modo sbagliato di farlo". –

2

Si può provare a utilizzare eval(), ma è pericoloso se le stringhe non sono venuta da voi. Altrimenti si potrebbe prendere in considerazione la creazione di un dizionario:

ops = {"+": (lambda x,y: x+y), "-": (lambda x,y: x-y)}

ecc ... e quindi chiamando

ops['+'] (1,2)
o, per l'input dell'utente:

if ops.haskey(userop): 
    val = ops[userop](userx,usery) 
else: 
    pass #something about wrong operator
12
import operator 

def get_operator_fn(op): 
    return { 
     '+' : operator.add, 
     '-' : operator.sub, 
     '*' : operator.mul, 
     '/' : operator.div, 
     '%' : operator.mod, 
     '^' : operator.xor, 
     }[op] 

def eval_binary_expr(op1, oper, op2): 
    op1,op2 = int(op1), int(op2) 
    return get_operator_fn(oper)(op1, op2) 

print eval_binary_expr(*("1 + 3".split())) 
print eval_binary_expr(*("1 * 3".split())) 
print eval_binary_expr(*("1 % 3".split())) 
print eval_binary_expr(*("1^3".split())) 
+0

In python3, questo dà: '+': operator.add, AttributeError: l'oggetto 'str' non ha attributo 'add' –

+0

Il problema è che l'operatore 'male' il parametro si scontra con il modulo operatore importato. Sto indovinando inline 'get_operator_fn' con' eval_binary_expr'. Cambia il parametro 'operator' in qualcos'altro, come' oper', e tutti i riferimenti ad esso. Vedi la mia modifica. – PaulMcG

+0

Per Python3, dovrai anche modificare 'operator.div' in' operator.truediv' e correggere tutte le istruzioni di stampa. – PaulMcG

1

A mio parere, la soluzione proposta da Amnon è quello giusto

Tuttavia, potrebbe anche essere interessati da questo articolo su un parser matematica: http://effbot.org/zone/simple-top-down-parsing.htm

+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - [Dalla recensione] (/ recensione/post di bassa qualità/18628184) – xgord

+0

Questo appartiene alla sezione commenti in quanto non è una risposta diretta. – Pablo

0

V'è un metodo magico corrispondente a ciascun operatore

OPERATORS = {'+': 'add', '-': 'sub', '*': 'mul', '/': 'div'} 

def apply_operator(a, op, b): 

    method = '__%s__' % OPERATORS[op] 
    return getattr(b, method)(a) 

apply_operator(1, '+', 2) 
+1

funziona bene, grazie per la condivisione. per la convalida possiamo estendere apply_operator. se op == '/' e b == 0: \t ritorno np.inf se op == '/' e un == 0: \t return 0 – iratzhash

+0

Questo non lascia [NotImplemented] (https: //docs.python.org/3/library/constants.html#NotImplemented) funzionano correttamente. – wim

Problemi correlati