2012-09-16 20 views
24

Czy można użyć bloku catch catch wewnątrz funkcji lambda. Potrzebuję funkcji lambda do przekonwertowania pewnej zmiennej na liczbę całkowitą, ale nie wszystkie wartości będą mogły zostać zamienione na liczby całkowite.Python Wypróbuj blok catch wewnątrz lambda

+0

http://stackoverflow.com/questions/7108193/frequently-repeated-try-except-in-python – squiguy

+1

nie _need_ funkcję lambda. Po prostu użyj nazwanej funkcji w swoim miejscu –

Odpowiedz

37

Nie. Wartość lambda w Pythonie może być tylko pojedynczym wyrażeniem. Użyj nazwanej funkcji.

Jest wygodny napisać rodzajowe funkcji do konwersji typów:

def tryconvert(value, default, *types): 
    for t in types: 
     try: 
      return t(value) 
     except ValueError, TypeError: 
      continue 
    return default 

Następnie można napisać lambda:

lambda v: tryconvert(v, 0, int) 

Można również napisać tryconvert() więc powraca funkcję, która przyjmuje wartość do konwersji; wtedy nie trzeba się lambda:

def tryconvert(default, *types): 
    def convert(value): 
     for t in types: 
      try: 
       return t(value) 
      except ValueError, TypeError: 
       continue 
     return default 
    return convert 

Teraz tryconvert(0, int) Zwraca funkcyjnych convert(value), która przyjmuje wartość i konwertuje go do liczby całkowitej i zwraca 0 jeśli nie można tego zrobić.

9

W tym konkretnym przypadku można uniknąć stosując try bloku tak:

lambda s: int(s) if s.isdigit() else 0 

W isdigit() string method Zwraca true jeśli wszystko postacie s są cyfry. (. Jeśli trzeba zaakceptować liczb ujemnych, trzeba będzie zrobić kilka dodatkowych kontroli)

1

W zależności od potrzeb, inne podejście może być, aby zachować szansę: catch poza lambda fn

toint = lambda x : int(x) 
strval = ['3', ''] 

for s in strval: 
    try: 
     print 2 + toint(s) 
    except ValueError: 
     print 2 

Wyjście:

5 
2 
Powiązane problemy