是否有类似Ruby的Python库(或模式)和?
例如,我有一个可能是None
的对象x
或一个float的字符串表示。 我想做以下事情:
do_stuff_with(float(x) if x else None)
除了不必输入x
两次,就像Ruby的andand库一样:
require 'andand' do_stuff_with(x.andand.to_f)
我们没有其中一个但是你自己也不难:
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
脱掉雷蒙德的想法,这里有一个制造这种条件包装的工厂。 为什么当你可以为你写Python时自己写’em?
def makeandand(func): return lambda x: func(x) if x else None andandfloat = makeandand(float) andandfloat('10.25') >>> 10.25 andandfloat('') >>> None
而且并不完全是Pythonic,但我不知道更好的名字。 因为你正在捕获无效值,所以可能trap
。
值得注意的是,常见的Python习惯是继续尝试做你需要做的事情,并在出现exception时处理它们。 这被称为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 (ie you only need it once or twice)... maketrap(float)(x) # ... just call it immediately
在你的用例中,我认为这种方法是一个胜利:它透明地处理任何可以转换为float
,并且如果一个虚假但可转换为float
值(如0)则做“正确的事情”传入。