是否有类似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)则做“正确的事情”传入。

Interesting Posts