Python 如何在具有相同条件的一个try/except块中对单个和循环操作进行分组?
我想知道是否有任何方法可以将下面的操作分组到一个try/except块中。我在这两种情况下使用相同的异常。我试图缩短这段代码,但没想到有什么好处。下面是示例代码:Python 如何在具有相同条件的一个try/except块中对单个和循环操作进行分组?,python,exception,try-except,Python,Exception,Try Except,我想知道是否有任何方法可以将下面的操作分组到一个try/except块中。我在这两种情况下使用相同的异常。我试图缩短这段代码,但没想到有什么好处。下面是示例代码: def cast_values(values): try: values['Price'] = float(values['Price']) except KeyError: pass for field in ('Pages', 'Quantity', 'Discount')
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块,你可以试着像这样重构,这太过分了
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语句的单循环,该语句容纳所有键/类型对
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语句,只需检查键是否在值中:
您可以通过分解键与特定类型的配对来概括代码。在那里,可以有一个包含一个try语句的单循环,该语句容纳所有键/类型对
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语句,只需检查键是否在值中:
+这是我的荣幸。这也是非常可扩展的,允许您为自定义转换器使用lambda函数。请注意,虽然您的无异常代码与原始帖子相同,但您可能希望捕获由类型\ux引发的任何异常。。。像intnon numeric这样的操作可能会失败,听起来OP可能不希望这样;我把它忘了,因为OP还没有这么做。可能是调用cast_values的任何东西都在捕获传播的任何ValueError。为此,为+1。这也是非常可扩展的,允许您为自定义转换器使用lambda函数。请注意,虽然您的无异常代码与原始帖子相同,但您可能希望捕获由类型\ux引发的任何异常。。。像intnon numeric这样的操作可能会失败,听起来OP可能不希望这样;我把它忘了,因为OP还没有这么做。可能是调用cast_values的任何东西都在捕获传播的任何ValueError。