Исходя из идеи Рэймонда, вот фабрика по производству условных упаковок такого типа.Зачем писать им самим, если вы можете сделать так, чтобы Python написал для вас?
def makeandand(func):
return lambda x: func(x) if x else None
andandfloat = makeandand(float)
andandfloat('10.25')
>>> 10.25
andandfloat('')
>>> None
andand
не совсем Pythonic, но я не могу найти лучшего имени.Возможно trap
, так как вы перехватываете недопустимое значение.
Стоит отметить, что распространенная идиома Python - это идти вперед и пытаться делать то, что вам нужно, и иметь дело с исключениями по мере их появления.Это называется EAFP, из принципа «Прошить прощения легче, чем разрешения».Так что, возможно, более Pythonic способ написать это:
def maketrap(func, *exceptions):
def trap(x):
try:
return func(x)
except exceptions or (Exception,):
return None
return andand
trapfloat = maketrap(float)
# optionally specify the exceptions to convert to a None return
# (default is to catch anything but you may want to allow some through)
trapfloat = maketrap(float, ValueError)
trapfloat = maketrap(float, ValueError, TypeError)
# if you don't want to store it (i.e. you only need it once or twice)...
maketrap(float)(x) # ... just call it immediately
В вашем случае использования, я думаю, что этот подход является выигрышным: он прозрачно имеет дело с все , которые могут быть преобразованы вfloat
, и делает "правильные вещи", если передается ложное-но-конвертируемое в float
значение (например, 0).