no protocolo no que diz respeito à sequência
Pergunta
Como isso é implementado em um nível python?
Eu tenho um objeto que pretende ser um dicionário em sua maior parte (em retrospectiva eu ??deveria ter apenas uma subclasse dict, mas eu prefiro não refatorar o código base, e eu também gostaria de saber isso para o futuro referência), que é algo um pouco como
class configThinger(object):
_config = {}
def __getitem__(self, key):
return self._config[key]
def __setitem__(self, key, value):
self._config[key] = value
O que funciona exatamente como é suposto e se comporta corretamente quando eu tentar acessá-lo de elementos como configThingerInstance [ 'o que quer']
Mas uma chamada como
t = configThinger()
t.populate() # Internal method that fills it with some useful data
if 'DEBUG' in t:
doStuff()
resulta numa KeyError sendo levantada devido presumivelmente a `em protocolo faz um
try:
t['DEBUG']
except KeyError:
pass
else:
doStuff()
Além disso, onde na documentação é isso?
Eu estava olhando ao redor
http://docs.python.org/tutorial/datastructures.html
http://docs.python.org/library/stdtypes.html
mas tragicamente tentando google para algo específico para a palavra 'em' é loucura: (
EDIT 1:
Com uma pilha de impressões de traço, eu posso ver que o programa chama configThingerInstance. getitem (0)
No entanto
t = {'rawk': 1,
'rawr': 2,
}
t[0] # Raises KeyError
'thing' in t # returns False
Solução
Parece que você quer sobrecarregar o operador in?
Você pode fazer isso definindo o __contains__
método: http: // docs .python.org / reference / datamodel.html # objeto. contém
Outras dicas
Para um melhor suporte para o operador in
(contenção aka verificação de adesão), implementar o método especial __contains__
em sua classe configThinger
:
class configThinger(object):
_config = {}
def __getitem__(self, key):
return self._config[key]
def __setitem__(self, key, value):
self._config[key] = value
def __contains__(self, key):
return key in self._config
os documentos são aqui (também explicar outras, formas menores para apoiar o operador in
).