たとえば、floatの文字列表現であるx
可能性のあるオブジェクトがあります。None
私は次のことをしたい:
do_stuff_with(float(x) if x else None)
x
Rubyのandandライブラリのように、2回入力する必要がない場合を除きます。
require 'andand'
do_stuff_with(x.andand.to_f)
私たちはそれらの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
レイモンドのアイデアを取り入れて、この種の条件付きラッパーを作成するためのファクトリがあります。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
の。