如何将单个操作和循环操作组合在一个具有相同条件的 try/except 块中?
How can I group single and loop operations in one try/except block with same condition?
我想知道是否有任何方法可以将以下操作分组在一个 try/except 块中。我在这两种情况下都使用相同的例外。我试图缩短这段代码,但我没有想到什么好事。这是示例代码:
def cast_values(values):
try:
values['Price'] = float(values['Price'])
except KeyError:
pass
for field in ('Pages', 'Quantity', 'Discount'):
try:
values[field] = int(values[field])
except KeyError:
pass
我要检查所有键,不管会发生多少异常。
如果你真的想要一个 try 块,你可以尝试像这样重构(老实说,这太过分了):
def cast_dict(dict_, key, type_):
try:
dict_[key] = type_(dict_[key])
except KeyError:
pass
def cast_values(values):
cast_dict(values, 'Price', float)
for field in ('Pages', 'Quantity', 'Discount'):
cast_dict(values, field, int)
您可以通过分解出键与特定类型的配对来概括您的代码。在那里你可以有一个单一的循环和一个单一的 try
语句来容纳你所有的 key/type 对。
def cast_values(values):
type_map = {
'Price': float,
'Pages': int,
'Quantity': int,
'Discount': int,
}
for key, type_ in type_map.items():
type_ = types.get(key, int)
try:
values[key] = type_(values[key])
except KeyError:
pass
在这种情况下,我可能会完全去掉 try
语句,如果密钥在 values
:
for key, type_ in type_map.items():
if key not in values:
continue
values[key] = type_(values[key])
我想知道是否有任何方法可以将以下操作分组在一个 try/except 块中。我在这两种情况下都使用相同的例外。我试图缩短这段代码,但我没有想到什么好事。这是示例代码:
def cast_values(values):
try:
values['Price'] = float(values['Price'])
except KeyError:
pass
for field in ('Pages', 'Quantity', 'Discount'):
try:
values[field] = int(values[field])
except KeyError:
pass
我要检查所有键,不管会发生多少异常。
如果你真的想要一个 try 块,你可以尝试像这样重构(老实说,这太过分了):
def cast_dict(dict_, key, type_):
try:
dict_[key] = type_(dict_[key])
except KeyError:
pass
def cast_values(values):
cast_dict(values, 'Price', float)
for field in ('Pages', 'Quantity', 'Discount'):
cast_dict(values, field, int)
您可以通过分解出键与特定类型的配对来概括您的代码。在那里你可以有一个单一的循环和一个单一的 try
语句来容纳你所有的 key/type 对。
def cast_values(values):
type_map = {
'Price': float,
'Pages': int,
'Quantity': int,
'Discount': int,
}
for key, type_ in type_map.items():
type_ = types.get(key, int)
try:
values[key] = type_(values[key])
except KeyError:
pass
在这种情况下,我可能会完全去掉 try
语句,如果密钥在 values
:
for key, type_ in type_map.items():
if key not in values:
continue
values[key] = type_(values[key])