Применить try / кроме нескольких определений классов Python - PullRequest
0 голосов
/ 22 апреля 2020

есть ли способ применить try / кроме logi c к нескольким определениям классов без try / кроме каждого определения?

Например, вместо:

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')

Я мог бы применить логи c с декоратором, как:

@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...

1 Ответ

1 голос
/ 22 апреля 2020

В целом это может быть не очень хорошей практикой, так как это действительно снижает читабельность вашего кода, но вы можете создать 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))

Опять же, я против использования такого рода обёрток для исключений, так как они сделают вашу жизнь труднее в долгосрочной перспективе, но это ваше дело!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...