毎回 try-except ブロックを追加する必要なく、このような 1 行の try-excepts を多数実行することが実際に役立つ場合がある状況を想像できます。
辞書 d とオブジェクト o があるとします。オブジェクトには、「a」、「b」、および「c」の 3 つの属性があります。ディクショナリ d は関数 generate_dict() を使用して生成され、「x」、「y」、および「z」のキーを持つ場合がありますが、特定のディクショナリにどのキーが存在するかはわかりません。キー 'x' の値を属性 'a' に、'y' を属性 'b' などに割り当てたい場合、次のように各割り当てを try-catch で囲む必要があります。
o = Object()
d = generate_dict()
try:
o.a = d['x']
except:
pass
try:
o.b = d['y']
except:
pass
など。 try-excepts を、特定のキーが辞書に存在するかどうかのチェックに置き換えることもできますが、問題はまだあります。何十ものキー属性マッピングがあるとどうなりますか? 行数は急速に増加します。
これをコーディングするもう 1 つの方法は、次のように、属性名とキー名の 2 つのテーブルを生成し、exec 関数を使用してループ内でコードを実行することです。
o = Object()
d = generate_dict()
attributeNames = ['a', 'b', 'c']
dataDictKeys = ['x', 'y', 'z']
for (attr, key) in zip(attributeNames, dataDictKeys):
try:
exec("o.{attr} = d['{key}']".format(attr = attr, key = key))
except:
pass
これはそのようなことを行うのに適したコーディング方法ではありませんが、それでも問題が解決する可能性があります。ただし、注意して使用してください。