2012-07-19 18 views
5

Sto provando a eseguire conversioni di tipi utilizzando un generatore, ma voglio passare all'elemento successivo nell'iteratore una volta che si ottiene un valore. Il mio tentativo attuale produrrà più valori nei casi in cui le espressioni hanno esito positivo:Rendimento solo una volta per iterazione

def type_convert(data): 
    for item in data: 
     try: 
      yield int(item) 
     except (ValueError, TypeError) as WrongTypeError: 
      pass 
     try: 
      yield float(item) 
     except (ValueError, TypeError) as WrongTypeError: 
      pass 
     yield item 

Come è stato realizzato?

+0

I' Sono piuttosto sicuro che mi manchi solo qualcosa, ma qual è il caso in cui il tuo cast 'int' fallirà ma il tuo cast su' float' avrà successo? –

+2

@NolenRoyalty - considera la stringa: ''1.0'' – mgilson

+0

@mgilson che ha perfettamente senso, grazie: D –

risposta

4

Si dovrebbe essere in grado di continue questo ciclo proprio come qualsiasi altro:

try: 
    yield int(item) 
    continue 
except (ValueError, TypeError) as WrongTypeError: 
    pass 

Come nota a margine, ho sempre pensato continue era un nome strano per questa struttura di controllo ...

e, ecco il tuo codice corretto in azione:

def type_convert(data): 
    for item in data: 
     try: 
      yield int(item) 
      continue 
     except (ValueError, TypeError) as WrongTypeError: 
      pass 
     try: 
      yield float(item) 
      continue 
     except (ValueError, TypeError) as WrongTypeError: 
      pass 
     yield item 


for a in type_convert(['a','1','1.0']): 
    print (a) 
4

non so se lo fa chiamata successiva() ad ogni tentativo di blocco, ma se questa è una preoccupazione di yo u, perché non fai

try: 
    item = int(item) 
except (ValueError, TypeError) as WrongTypeerror 
    try: 
     item = float(item) 
    except (ValueError, TypeError) as WrongTypeError 
     pass 
yield item 
0

Questo funziona:

def type_convert(data): 
    for item in data: 
     try: 
      yield int(item) 
      continue 
     except (ValueError, TypeError) as WrongTypeError: 
      pass 
     try: 
      yield float(item) 
      continue 
     except (ValueError, TypeError) as WrongTypeError: 
      pass 
     yield item 

questo è il risultato:

>>> list(type_convert(["13", 3.5, True])) 
[13, 3, 1] 
0

Ecco una risposta generalizzata:

def type_convert(*args): 
    datatypes = [] 
    for arg in args: 
     if type(arg) == type(type): 
      datatypes += [arg] 
     else: 
      data = arg 
    for item in data: 
     for datatype in datatypes: 
      try: 
       yield datatype(item) 
       break 
      except (ValueError, TypeError) as WrongTypeError: 
       pass 
     else: 
      yield item # unable to convert to any datatype 

for a in type_convert(int, float, ['a','1','1.0']): 
    print (a)