Как перехватить определенный поиск кортежей в 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
Но это не вариант для меня, потому что у меня есть много унаследованного кода, к которому я не могу прикоснуться, но все же мне нужно отчитаться.