是否存在像Ruby和?的Python库(或模式)?

时间:2011-10-26 04:18:30

标签: python ruby null andand

例如,我有一个可能是x的对象None或一个浮点数的字符串表示。我想做以下事情:

do_stuff_with(float(x) if x else None)

除了必须两次输入x之外,与Ruby的andand库一样:

require 'andand'
do_stuff_with(x.andand.to_f)

2 个答案:

答案 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)。