6

たとえば、floatの文字列表現であるx可能性のあるオブジェクトがあります。None私は次のことをしたい:

do_stuff_with(float(x) if x else None)

xRubyのandandライブラリのように、2回入力する必要がない場合を除きます。

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

2 に答える 2

9

私たちはそれらの1つを持っていませんが、あなた自身を転がすのは難しいことではありません:

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
于 2011-10-26T04:36:33.423 に答える
4

レイモンドのアイデアを取り入れて、この種の条件付きラッパーを作成するためのファクトリがあります。Pythonに'emを書かせてもらえるのに、なぜ自分で' 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

あなたのユースケースでは、このアプローチは勝利だと思います。これは、に変換できるものすべてを透過的に処理し、偽の、しかし変換可能な値(0など)が渡されfloatた場合に「正しいこと」を実行します。floatの。

于 2011-10-26T04:43:20.637 に答える