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 getitem pesquisa () para a chave em questão. Preciso levantar alguma outra exceção para dizer em que ele não está lá? Eu prefiro não fazer algo assim.

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
Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top