Как перехватить определенный поиск кортежей в Python

Мне интересно, как можно создать программу для обнаружения следующих случаев в коде при динамическом сравнении переменной с жестко заданными значениями вместо перечисления?

class AccountType:
    BBAN = '000'
    IBAN = '001'
    UBAN = '002'
    LBAN = '003'

Я хотел бы, чтобы код сообщал (сбросить предупреждение в журнал) в следующем случае:

payee_account_type = self.get_payee_account_type(rc)     # '001' for ex.
if payee_account_type in ('001', '002'):                 # Report on unsafe lookup
    print 'okay, but not sure about the codes, man'

Чтобы побудить людей использовать следующий подход:

payee_account_type = self.get_payee_account_type(rc)
if payee_account_type in (AccountType.IBAN, AccountType.UBAN):
    print 'do this for sure'

Что намного безопаснее.


Это не проблема, чтобы проверить == а также != проверяет как ниже:

if payee_account_type == '001':
    print 'codes again'

Оборачивая payee_account_type в класс, со следующим __eq__ внедрено:

class Variant:
    def __init__(self, value):
        self._value = value

    def get_value(self):
        return self._value

class AccountType:
    BBAN = Variant('000')
    IBAN = Variant('001')
    UBAN = Variant('002')
    LBAN = Variant('003')

class AccountTypeWrapper(object):
    def __init__(self, account_type):
        self._account_type = account_type

    def __eq__(self, other):
        if isinstance(other, Variant):
            # Safe usage
            return self._account_type == other.get_value()

        # The value is hardcoded
        log.warning('Unsafe comparison. Use proper enumeration object')
        return self._account_type == other

Но что делать с поиском кортежей?


Я знаю, я мог бы создать метод соглашения, оборачивающий поиск, где проверка может быть сделана:

if IbanUtils.account_type_in(account_type, AccountType.IBAN, AccountType.UBAN):
    pass

class IbanUtils(object):
    def account_type_in(self, account_type, *types_to_check):
        for type in types_to_check:
            if not isinstance(type, Variant):
                log.warning('Unsafe usage')

            return account_type in types_to_check

Но это не вариант для меня, потому что у меня есть много унаследованного кода, к которому я не могу прикоснуться, но все же мне нужно отчитаться.

0 ответов

Другие вопросы по тегам