1. ホーム
  2. パイソン

[解決済み】Pythonのtry/exceptブロックのネストは良いプログラミングの練習になりますか?

2022-04-04 21:44:38

質問

私は独自のコンテナを書いていて、属性呼び出しによって内部の辞書にアクセスできるようにする必要があります。このコンテナの典型的な使い方は、次のようなものです。

dict_container = DictContainer()
dict_container['foo'] = bar
...
print dict_container.foo

こんなことを書くのは馬鹿らしいかもしれませんが、これは私が提供しなければならない機能です。次のような方法で実装しようと考えていました。

def __getattribute__(self, item):
    try:
        return object.__getattribute__(item)
    except AttributeError:
        try:
            return self.dict[item]
        except KeyError:
            print "The object doesn't have such attribute"

ネストされたtry/exceptブロックが良い方法かどうかは分からないので、別の方法として hasattr()has_key() :

def __getattribute__(self, item):
        if hasattr(self, item):
            return object.__getattribute__(item)
        else:
            if self.dict.has_key(item):
                return self.dict[item]
            else:
                raise AttributeError("some customised error")

あるいは、このように1つのtry catchブロックを使用することもできます。

def __getattribute__(self, item):
    if hasattr(self, item):
        return object.__getattribute__(item)
    else:
        try:
            return self.dict[item]
        except KeyError:
            raise AttributeError("some customised error")

どの選択肢が最もPythonicでエレガントでしょうか?

どのように解決するのですか?

最初の例は全く問題ありません。Pythonの公式ドキュメントでさえ、このスタイルを推奨しています。 EAFP .

個人的には、必要のないネストは避けたほうがいいと思います。

def __getattribute__(self, item):
    try:
        return object.__getattribute__(item)
    except AttributeError:
        pass  # Fallback to dict
    try:
        return self.dict[item]
    except KeyError:
        raise AttributeError("The object doesn't have such attribute") from None

PS. has_key() は、Python 2 では長い間非推奨とされてきました。使用する item in self.dict 代わりに