次の手書き関数と同等の標準関数 (演算子、デコレータ) を探しています。
def defaulted(func, defaultVal):
try:
result = func()
except:
result = defaultVal
return result
ありがとう!
次の手書き関数と同等の標準関数 (演算子、デコレータ) を探しています。
def defaulted(func, defaultVal):
try:
result = func()
except:
result = defaultVal
return result
ありがとう!
stdlib にはそのようなものはありません (私の知る限り)。1つには、これは悪い習慣ですexcept
。(代わりに、キャッチしたい例外を指定してください。そうすれば、すべてをキャッチすることはできません!)
ここにデコレータがあります:
>>> def defaultval(error, value):
... def decorator(func):
... def defaulted(*args, **kwargs):
... try:
... return func(*args, **kwargs)
... except error:
... return value
... return defaulted
... return decorator
...
>>> @defaultval(NameError, "undefined")
... def get_var():
... return name
...
>>> get_var()
'undefined'
いいえ。Python の哲学は、明示的は暗黙的よりも優れているというものです。dict.__getitem__ のように定期的に例外をスローすることが期待されるほとんどの Python 関数は、dict.get のようにデフォルト値を返す同等のバージョンを提供します。
以前に、このようなものに new with contexts を使用したことがあります。コードは次のようになりました。
with ignoring(IOError, OSError):
# some non-critical file operations
しかし、私も何も返す必要はありませんでした。一般に、関数全体のレベルはこれには適していません。デコレータを使用すると、他の場所でより適切に処理したい場合に、実際にエラーが発生する可能性をブロックできます。
また、except:
非常に危険です。おそらく、(少なくとも) を意味しexcept Exception:
、おそらく IOError や KeyError のように、さらに厳密に範囲が限定されたものを意味します。そうしないと、Ctrl-C、SystemExit、変数名のスペルミスなども検出されます。