1

次の手書き関数と同等の標準関数 (演算子、デコレータ) を探しています。

def defaulted(func, defaultVal):
   try:
      result = func()
   except: 
      result = defaultVal

   return result

ありがとう!

4

2 に答える 2

5

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'
于 2011-01-18T18:46:23.450 に答える
3

いいえ。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、変数名のスペルミスなども検出されます。

于 2011-01-18T18:46:55.920 に答える