将try / except应用于多个Python类定义

问题描述 投票:0回答:1

是否有一种方法可以将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...
python flask sqlalchemy flask-sqlalchemy python-decorators
1个回答
1
投票

一般来说,这可能不是一个好习惯,因为它确实会降低代码的可读性,但是您可以像这样创建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))

再次,我反对使用这种包装作为例外,因为从长远来看,它们会使您的生活更加困难,但这取决于您!

© www.soinside.com 2019 - 2024. All rights reserved.