-
Notifications
You must be signed in to change notification settings - Fork 44
#390: Refatorando importadores CONV #474
base: master
Are you sure you want to change the base?
Conversation
Pull Request Test Coverage Report for Build 983
💛 - Coveralls |
votos_monarquistas = [models.SIM, models.AUSENTE, models.SIM] | ||
self._gera_votos(votacao, MONARQUISTAS, votos_monarquistas) | ||
def _gera_votacao_geral(self): | ||
for i in range(len(self._votacao_params)): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pessoal,
primeiro que não faz sentido usar um dicionário (_votacao_params
) e tratar as "keys" do dicionário como "índices".
Segundo que ao invés de usar for i in range(len(self._votacao_params))
e depois ficar acessando os "índices", podemos ser mais diretos com python e "loopar" diretamente nos itens.
Exexemplo didático caso _votacao_params
seja um dicionário:
_votacao_params = {
1: ['Reforma agrária',
[models.SIM, models.ABSTENCAO, models.NAO],
[models.SIM, models.SIM, models.SIM],
[models.NAO, models.NAO, models.NAO]],
2: ['Aumento da pensão dos nobres',
[models.NAO, models.NAO, models.NAO],
[models.NAO, models.NAO, models.NAO],
[models.SIM, models.SIM, models.SIM]]
}
for key, value in _votacao_params.items():
list_params = value
numero_prop = int(key)
descricao_prop = list_params[0]
prop = self._gera_proposicao(numero_prop, descricao_prop)
votacao = self._gera_votacao(
numero_prop, descricao_prop,
DATA_NO_PRIMEIRO_SEMESTRE, prop)
self._gera_votos(votacao, GIRONDINOS, list_params[1])
self._gera_votos(votacao, JACOBINOS, list_params[2])
self._gera_votos(votacao, MONARQUISTAS, list_params[3])
Outra opção é usar uma lista no lugar do dicionário:
_votacao_params = [
['Reforma agrária',
[models.SIM, models.ABSTENCAO, models.NAO],
[models.SIM, models.SIM, models.SIM],
[models.NAO, models.NAO, models.NAO]
],
['Aumento da pensão dos nobres',
[models.NAO, models.NAO, models.NAO],
[models.NAO, models.NAO, models.NAO],
[models.SIM, models.SIM, models.SIM]
]
]
for index, item in enumerate(_votacao_params):
list_params = item
numero_prop = int(index+1)
descricao_prop = list_params[0]
prop = self._gera_proposicao(numero_prop, descricao_prop)
votacao = self._gera_votacao(
numero_prop, descricao_prop,
DATA_NO_PRIMEIRO_SEMESTRE, prop)
self._gera_votos(votacao, GIRONDINOS, list_params[1])
self._gera_votos(votacao, JACOBINOS, list_params[2])
self._gera_votos(votacao, MONARQUISTAS, list_params[3])
Mas, objetivando ficar com apenas 1 método "gera_votacoes", eu faria algo mais ou menos na seguinte linha:
_votacao_params = [
{"descricao": 'Reforma agrária',
"partidos": {
"GIRONDINOS": [models.SIM, models.ABSTENCAO, models.NAO],
"JACOBINOS": [models.SIM, models.SIM, models.SIM],
"MONARQUISTAS": [models.NAO, models.NAO, models.NAO])
]
for index, votacao in enumerate(_votacao_params):
numero = int(index+1)
descricao = votacao.get("descricao")
proposicao = self._gera_proposicao(numero, descricao)
partidos = votacao.get("partidos")
votacao = self._gera_votacao(
numero, descricao, DATA_NO_PRIMEIRO_SEMESTRE, proposicao)
for partido, votos in partidos.items():
self._gera_votos(votacao, partido, votos)
Dessa forma vocês conseguem inclusive incluir os dados da "votação8" e remover também o método "gera_proposicao10".
Aliás, pensando melhor aqui..... esses dados do "_votacoes_param" poderiam ficar num arquivo externo (csv ou json) que é lido nesse código que vocês fizeram, ao invés de ficar "hard-coded" dentro do módulo. |
2f64467
to
01ea232
Compare
prop.descricao = descricao | ||
prop.casa_legislativa = self.casa | ||
if (indexacao and ementa) is not None: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Essa sintaxe está incorreta em python.
if (indexacao and ementa) is not None:
é diferente de if indexacao is not None and ementa is not None:
.
Aliás, não sei se os dois precisam se tratados de forma conjunta....
Porque não um if/else
para cada, individualmente?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A ideia era que só estou trabalhando com dois casos:
- Quando se passa valor pra indexacao e ementa, ou seja, de forma conjunta
- Quando nao se passa, ai só ementa é tratada e de forma diferente.
Talvez trabalhar de forma individual, seja mais expansivo, mas não sei se é necessário. E também o código fica um pouco mais enxuto. O que você acha?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@peddrro entendi o seu ponto.
A questão é: O método possui os dois argumentos, e de forma "desvinculada".
Se alguém passar "ementa" e não passar "indexação", vai esperar que a "ementa" seja usada - e vice-versa.
Isso talvez gere dúvidas em quem for utilizar o método.
@leonardofl o que você acha?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@diraol Verdade, que tal eu passar um parametro só entao, que represente os dois para não haver essa "desvinculação" e consequentemente não gerar dúvidas? Acha que seria uma boa?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pode ser uma boa opção. Aí vc cria esse objeto com um construtor que recebe os dois parâmetros (sem valor default), pra dizer que se criar o objeto, tem que usar os dois parâmetros.
Pra não criar uma classe nova, outra opção é criar dois métodos... um que não recebe (indexacao, ementa) e outro que recebe (indexacao, ementa), sem valores defaults. É um tanto quanto "javístico", mas acho q nesse caso tb ajudaria o entendimento de quem for usar o método.
|
||
def _gera_votacao_geral(self): | ||
data = self._obtem_dados_json() | ||
votacoes_params = data["votacoes_params"] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A variável data
, gerada na linha anterior pela chamada do método _obtem_dados_json()
pode ser None
.
Se for, a expressão data["votacoes_params"]
vai levantar uma excessão necessariamente. Isso precisa ser tratado corretamente, e isso pode se dar de diversas formas.
Verificando se data is None
, retornando um dicionário com valor vazio para a chave "votacoes_params", retornando um dicionário vazio no método e usando o get
ao invésde ["votacoes_params"]
e definindo um valor default no get... enfim...
Independente disso, eu acho que estão faltando testes para os novos métodos que foram escritos/implementados.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok! Irei fazer as devidas alterações. Obrigado pelas dicas =)
Resolve #390