[解決済み】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
代わりに
関連
-
[解決済み] [Solved] sklearn error ValueError: 入力に NaN、infinity または dtype('float64') に対して大きすぎる値が含まれている。
-
[解決済み】Python regex AttributeError: 'NoneType' オブジェクトに 'group' 属性がない。
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み] Pythonが解釈される場合、.pycファイルとは何ですか?
-
[解決済み] Pythonの「名前付きタプル」とは何ですか?
-
[解決済み] すべての例外をキャッチする `try`/`except` ブロックはどのように書けばよいですか?
-
[解決済み] Pythonのtry-else
-
[解決済み] Pythonのリクエストモジュールを使ってtry/exceptする正しい方法?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonでtry-except-elseを使用するのは良い習慣ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PythonによるLeNetネットワークモデルの学習と予測
-
opencvとpillowを用いた顔認証システム(デモあり)
-
Python Decorator 練習問題
-
Python カメの描画コマンドとその例
-
Python入門 openを使ったファイルの読み書きの方法
-
FacebookオープンソースワンストップサービスpythonのタイミングツールKats詳細
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み】numpyの配列連結。"ValueError:すべての入力配列は同じ次元数でなければならない"
-
[解決済み】「SyntaxError.Syntax」は何ですか?Missing parentheses in call to 'print'」はPythonでどういう意味ですか?
-
[解決済み】Pythonの "raise from "の使い方