Python 3.2.3. Algumas ideias foram listadas aqui , que funcionam em vars normais, mas parece que ** kwargs seguem regras diferentes ... então por que isso não funciona e como posso verificar se existe uma chave em ** kwargs?
if kwargs['errormessage']:
print("It exists")
Eu também acho que isso deveria funcionar, mas não -
if errormessage in kwargs:
print("yeah it's here")
Estou supondo porque kwargs é iterável? Tenho que iterar por ele apenas para verificar se uma chave específica está lá?
python
dictionary
python-3.x
kwargs
Zamphatta
fonte
fonte
Respostas:
Você quer
Para obter o valor de
errormessage
Dessa forma,
kwargs
é apenas mais umadict
. Seu primeiro exemploif kwargs['errormessage']
,, significa "obter o valor associado à chave" mensagem de erro "em kwargs e, em seguida, verificar seu valor bool". Portanto, se essa chave não existir, você receberá umKeyError
.Seu segundo exemplo
if errormessage in kwargs:
,, significa "sekwargs
contém o elemento nomeado por"errormessage
"e, a menos que"errormessage
"seja o nome de uma variável, você obterá umNameError
.Devo mencionar que os dicionários também têm um método
.get()
que aceita um parâmetro padrão (ele próprio assumindo o padrãoNone
), de modo quekwargs.get("errormessage")
retorna o valor se essa chave existir e deNone
outra forma (da mesma formakwargs.get("errormessage", 17)
que você pode pensar que faz). Quando você não se importa com a diferença entre a chave existente e tendoNone
como valor ou a chave não existente, isso pode ser útil.fonte
kwargs.get("errormessage", 17)
pode retornar seu valor ou17
se errormessage não existir - mas não tenho certeza. Isso é correto?As respostas do DSM e do Tadeck respondem diretamente à sua pergunta.
Em meus scripts, costumo usar o conveniente
dict.pop()
para lidar com argumentos opcionais e adicionais. Aqui está um exemplo de umprint()
invólucro simples :Então:
Como você pode ver, se
prefix
não estiver contido emkwargs
, o padrão''
(string vazia) está sendo armazenado naprefix
variável local . Se for fornecido, então seu valor está sendo usado.Esta é geralmente uma receita compacta e legível para escrever wrappers para qualquer tipo de função: sempre apenas repasse os argumentos que você não entende e nem mesmo sabe se eles existem. Se você sempre passa
*args
e**kwargs
torna seu código mais lento e requer um pouco mais de digitação, mas se as interfaces da função chamada (neste casoprint
) mudarem, você não precisa mudar seu código. Essa abordagem reduz o tempo de desenvolvimento ao mesmo tempo que oferece suporte a todas as alterações de interface.fonte
prefix
.É apenas isso:
Você precisa verificar se a chave está no dicionário. A sintaxe para isso é
some_key in some_dict
(ondesome_key
é algo com hash, não necessariamente uma string).As ideias que você vinculou ( essas ideias ) continham exemplos para verificar se existia uma chave específica nos dicionários retornados por
locals()
eglobals()
. Seu exemplo é semelhante, porque você está verificando a existência de uma chave específica nokwargs
dicionário (o dicionário que contém argumentos de palavras-chave).fonte
Uma maneira é adicionar você mesmo! Quão? Ao mesclar
kwargs
com um monte de padrões. Isso não será apropriado em todas as ocasiões, por exemplo, se as chaves não forem conhecidas por você com antecedência. No entanto, se forem, aqui está um exemplo simples:Os padrões são definidos no dicionário
args
, que inclui todas as chaves que esperamos. Primeiro verificamos se existem chaves inesperadas nos kwargs. Em seguida, atualizamosargs
com okwargs
qual substituirá quaisquer novos valores que o usuário tenha definido. Não precisamos testar se existe uma chave, agora usamosargs
como nosso dicionário de argumentos e não precisamos mais dissokwargs
.fonte
Você pode descobrir essas coisas facilmente por si mesmo:
fonte
in
operador em si não é fácil se você nunca programou e / ou é novo no Python. Ele está apenas sendo sugerido na ajudadict.get()
edict.setdefault()
.fonte