Supondo que connectionDetails
seja um dicionário Python, qual é a melhor, mais elegante e mais "pitônica" maneira de refatorar códigos como esse?
if "host" in connectionDetails:
host = connectionDetails["host"]
else:
host = someDefaultValue
python
dictionary
coding-style
mnowotka
fonte
fonte
if/else
é muito mais rápido. Isso pode ou não desempenhar um papel.if/else
é mais rápido?Você também pode usar o seguinte
defaultdict
:Você pode passar qualquer função comum em vez de lambda:
fonte
get
métodos semelhantes.Embora
.get()
seja um bom idioma, é mais lento queif/else
(e mais lento quetry/except
se a presença da chave no dicionário puder ser esperada na maioria das vezes):fonte
if/then
que seria mais rápido. Ambos os casos requerem uma pesquisa de dicionário, ea menos que a invocaçãoget()
é assim muito mais lento, o que contas mais para a desaceleração?O(1)
independente do tamanho do dicionário, portanto a sobrecarga da chamada de função é relevante.Para vários padrões diferentes, tente o seguinte:
fonte
None
ou emptyString como um dos valores nos pares de chave-valor. Odefaults
dicionário pode potencialmente ter um de seus valores apagados acidentalmente. (veja também stackoverflow.com/questions/6354436 )Há um método nos dicionários python para fazer isso:
dict.setdefault
No entanto, este método define o valor
connectionDetails['host']
parasomeDefaultValue
se chavehost
não estiver definido, ao contrário do que a pergunta.fonte
setdefault()
o valor retorna, assim que isso funciona assim:host = connectionDetails.setdefault('host', someDefaultValue)
. Apenas tome cuidado para que ele definaconnectionDetails['host']
o valor padrão se a chave não estava lá antes.(esta é uma resposta tardia)
Uma alternativa é subclassificar a
dict
classe e implementar o__missing__()
método, assim:Exemplos:
fonte
Testando a suspeita de @Tim Pietzcker sobre a situação no PyPy (5.2.0-alpha0) para o Python 3.3.5, acho que, de fato, ambos
.get()
e oif
/else
way têm desempenho semelhante. Na verdade, parece que no caso if / else existe apenas uma pesquisa se a condição e a atribuição envolverem a mesma chave (compare com o último caso em que há duas pesquisas).fonte
Você pode usar uma função lamba para isso como uma linha. Faça um novo objeto
connectionDetails2
que seja acessado como uma função ...Agora usa
ao invés de
que retorna o valor do dicionário se
k
estiver nas chaves, caso contrário, retorna"DEFAULT"
fonte