Skip to content

Instantly share code, notes, and snippets.

@valdergallo
Last active October 26, 2017 13:00
Show Gist options
  • Save valdergallo/acacb65fc17d2205fbc905b9f8cc6533 to your computer and use it in GitHub Desktop.
Save valdergallo/acacb65fc17d2205fbc905b9f8cc6533 to your computer and use it in GitHub Desktop.
One simple bitwise method to search items in multiple items
class Bitwise(object):
def __init__(self, value=None):
"""
Create one set to compare multiple lists
Usage:
# consts
SAO_PAULO = 'sp'
RIO_DE_JANEIRO = 'rj'
CURITIBA = 'ct'
PORTO_ALEGRE = 'pa'
BELO_HORIZONTE = 'bh'
TRANSPORT_TYPE_MOTORCYCLE = 'mt'
TRANSPORT_TYPE_CAR = 'car'
TRANSPORT_TYPE_VAN = 'van'
SP = Bitwise(SAO_PAULO)
RJ = Bitwise(RIO_DE_JANEIRO)
CT = Bitwise(CURITIBA)
PA = Bitwise(PORTO_ALEGRE)
BH = Bitwise(BELO_HORIZONTE)
MOTOCYCLE = Bitwise(TRANSPORT_TYPE_MOTORCYCLE)
CAR = Bitwise(TRANSPORT_TYPE_CAR)
VAN = Bitwise(TRANSPORT_TYPE_VAN)
ALL_CITIES = SP | RJ | CT | PA | BH
ALL_TRANSPORT_TYPES = MOTOCYCLE | VAN | CAR
REQUIRED_DOCUMENTS = [
(DOCUMENT_TYPE_RG, (ALL_CITIES, ALL_TRANSPORT_TYPES)),
(DOCUMENT_TYPE_CPF, (ALL_CITIES, ALL_TRANSPORT_TYPES)),
(DOCUMENT_TYPE_CNPJ, (ALL_CITIES, ALL_TRANSPORT_TYPES)),
(DOCUMENT_TYPE_BANK_ACCOUNT, (ALL_CITIES, ALL_TRANSPORT_TYPES)),
(DOCUMENT_TYPE_ADDRESS_DATA, (ALL_CITIES, ALL_TRANSPORT_TYPES)),
(DOCUMENT_TYPE_CNH, (ALL_CITIES, ALL_TRANSPORT_TYPES)),
(DOCUMENT_TYPE_CONDUMOTO, (CT | BH | SP, MOTOCYCLE)),
(DOCUMENT_TYPE_LICENCA_PREFEITURA, (SP | CT, MOTOCYCLE)),
(DOCUMENT_TYPE_DOCUMENTO_VEICULO, (SP | CT, MOTOCYCLE | VAN)),
(DOCUMENT_TYPE_DOCUMENTO_VEICULO, (RJ | BH | PA, MOTOCYCLE)),
(DOCUMENT_TYPE_DOCUMENTO_VEICULO, (ALL_CITIES, CAR)),
(DOCUMENT_TYPE_RNTRC, (ALL_CITIES, VAN)),
]
>>> [doc for doc, bit in REQUIRED_DOCUMENTS if bit == (city_slug, transport_type)]
[DOCUMENT_TYPE_RG,DOCUMENT_TYPE_CPF,DOCUMENT_TYPE_CNPJ, DOCUMENT_TYPE_LICENCA_PREFEITURA]
Args:
value: set | string
"""
try:
if not isinstance(value, set):
self.values = set([value])
else:
self.values = value
except TypeError:
raise TypeError('The value must be one (set() |'
'| string | int | float) to create one Bitwise')
def __or__(self, other):
if isinstance(other, Bitwise):
values = set(self.values)
values.update(other.values)
return Bitwise(values)
return self
def __eq__(self, other):
return other in self.values
def __repr__(self):
return ','.join(self.values)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment