例如,我有一个可能是x
的对象None
或一个浮点数的字符串表示。我想做以下事情:
do_stuff_with(float(x) if x else None)
除了必须两次输入x
之外,与Ruby的andand库一样:
require 'andand'
do_stuff_with(x.andand.to_f)
答案 0 :(得分:9)
我们没有其中任何一个但是你自己也不难:
def andand(x, func):
return func(x) if x else None
>>> x = '10.25'
>>> andand(x, float)
10.25
>>> x = None
>>> andand(x, float) is None
True
答案 1 :(得分:4)
起飞Raymond的想法,这是一个制造这种条件包装的工厂。为什么当你可以为你写Python时自己写'em?
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
的任何,如果是虚假的话,它会做“正确的事情”传入-but-convertible-to - float
值(例如0)。