是否有一种方法可以将try / except逻辑应用于多个类定义,而无需在每个定义中使用try / except?
例如,代替:
def test_table(tablename):
return Table(tablename, db.metadata, Column('id', Integer, primary_key=True))
class User(db.Model):
try:
__table__ = db.metadata.tables['user']
__bind_key__ = 'secondary'
# More attrs...
except KeyError:
__table__ = test_table('user')
class Policy(db.Model):
try:
__table__ = db.metadata.tables['policy']
__bind_key__ = 'secondary'
# More attrs...
except KeyError:
__table__ = test_table('policy')
我可以使用类似装饰器的逻辑:
@if_no_metadata_use_default('user')
class User(db.Model):
__table__ = db.metadata.tables['user']
__bind_key__ = 'secondary'
# More attrs...
@if_no_metadata_use_default('policy')
class Policy(db.Model):
__table__ = db.metadata.tables['policy']
__bind_key__ = 'secondary'
# More attrs...
一般来说,这可能不是一个好习惯,因为它确实会降低代码的可读性,但是您可以像这样创建exception_wrapper
装饰器:
def exception_wrapper(func):
def run(exception, on_exception, *args, **kwargs):
try:
return func(*args, **kwargs)
except exception:
on_exception()
return run
def on_exception():
pass
@exception_wrapper
def f(a, b):
if a < b:
raise NotImplementedError
return a + b
print(f(NotImplementedError, on_exception, 10, 2))
再次,我反对使用这种包装作为例外,因为从长远来看,它们会使您的生活更加困难,但这取决于您!