Eu preciso de uma maneira de obter um valor de dicionário se sua chave existir, ou simplesmente retornar None
, se não existir.
No entanto, o Python gera uma KeyError
exceção se você procurar uma chave que não existe. Eu sei que posso verificar a chave, mas estou procurando algo mais explícito. Existe uma maneira de retornar apenas None
se a chave não existir?
python
dictionary
key
nonetype
Spyros
fonte
fonte
.get(key)
vez de[key]
Respostas:
Você pode usar
dict.get()
que retornará
None
sekey is not in d
. Você também pode fornecer um valor padrão diferente que será retornado em vez deNone
:fonte
None
se a chave for explicitamente mapeadaNone
no dict. Se não é isso que você deseja, você pode usar algo comod.get(key) or "empty"
.[]
,""
,False
,0.0
ou, na verdadeNone
), então sua solução seria sempre voltar0
. Se você esperaNone
s como valores, precisará fazer aif key in d:
verificação explicitamente."empty"
será retornado sekey
não for uma chave válidad
. Não tem nada a ver com o valor quekey
está mapeado.Não me pergunto mais. Está embutido no idioma.
fonte
Usar
dict.get
Retorna o valor da chave se a chave estiver no dicionário, caso contrário, será o padrão. Se o padrão não for fornecido, o padrão será Nenhum, para que esse método nunca gere um KeyError.
fonte
Você deve usar o
get()
método dadict
classeIsso resultará em
r == None
. Se a chave não for encontrada no dicionário, a função get retornará o segundo argumento.fonte
None
explicitamente. É o padrão.Se você deseja uma solução mais transparente, pode subclassear
dict
para obter este comportamento:fonte
defaultdict
é que ele crescerá cada vez que um elemento que ainda não está lá é solicitado. Isso nem sempre é desejável.foo['bar']['test']['sss']
para voltarNone
em vez de exceção, Depois de uma profundidade que ela começar a darTypeError
em vez deKeyError
NoneDicts
. Isso ajudaria no caso deKeyError
isso acontecer no objeto mais interno. Caso contrário, o problema é que, depois de retornar umNone
objeto, você não pode mais assiná-lo. Um truque feio seria retornar outro objeto que testa comoNone
. Cuidado, porém, que isso pode levar a erros horríveis.return dict.get(self, key)
parareturn super().get(key)
? Então, se eu decidir usar OrderedDict em vez de dict, por exemplo, não preciso me preocupar em alterar várias linhas de código.Eu costumo usar um padrão para situações como esta. Você fornece um método de fábrica que não aceita argumentos e cria um valor quando vê uma nova chave. É mais útil quando você deseja retornar algo como uma lista vazia em novas chaves ( veja os exemplos ).
fonte
defaultdict
é que ele continuará crescendo toda vez que um elemento não existente for solicitado.Você pode usar
dict
oget()
método de um objeto , como outros já sugeriram. Como alternativa, dependendo exatamente do que você está fazendo, você poderá usar umtry/except
conjunto como este:O que é considerado uma abordagem muito "pitônica" para lidar com o caso.
fonte
Uma solução de uma linha seria:
Isso é útil ao tentar adicionar valores de dicionário a uma nova lista e desejar fornecer um padrão:
por exemplo.
fonte
Como outros já disseram acima, você pode usar get ().
Mas para verificar uma chave, você também pode:
fonte
get
método.Fiquei surpreso com o que era possível em python2 vs python3. Vou respondê-lo com base no que acabei fazendo pelo python3. Meu objetivo era simples: verificar se uma resposta json no formato de dicionário deu um erro ou não. Meu dicionário é chamado "token" e minha chave que estou procurando é "error". Estou procurando a chave "erro" e, se não estiver lá, configurando-o para o valor Nenhum, então verificando se o valor é Nenhum, se assim for, prossiga com o meu código. Uma instrução else seria manipulada se eu tiver a chave "erro".
fonte
Se você pode fazer isso
False
, também há a função interna hasattr :fonte