Existe uma maneira no Python para determinar se um objeto tem algum atributo? Por exemplo:
>>> a = SomeClass()
>>> a.someProperty = value
>>> a.property
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: SomeClass instance has no attribute 'property'
Como você pode saber se a
tem o atributo property
antes de usá-lo?
python
attributes
Lucas Gabriel Sánchez
fonte
fonte
import string hasattr(string, "lower")
hasattr
é exatamente o mesmo que usartry
/except AttributeError
: a docstring do hasattr (no Python 2.7) diz que ele usa a mão getattr captura exceções.hasattr
infelizmente não é exatamente o mesmo quetry: ... except AttributeError:
no Python 2.x, jáhasattr
que capturará todas as exceções . Por favor, veja minha resposta para um exemplo e uma solução simples.Como Jarret Hardie respondeu,
hasattr
fará o truque. Gostaria de acrescentar, no entanto, que muitos na comunidade Python recomendam uma estratégia "mais fácil pedir perdão do que permissão" (EAFP) do que "olhar antes de pular" (LBYL). Veja estas referências:EAFP vs LBYL (Re: um pouco decepcionado até agora)
EAFP vs LBYL @Code Como um Pythonista: Idiomatic Python
ou seja:
... é preferido para:
fonte
try:
deve ser a tentativa de acesso ao atributo; não há razão para encerrar a execuçãodoStuff
também. No entanto, ainda existe algum potencial de ambiguidade: seproperty
for uma propriedade calculada em vez de um atributo simples, sua implementação poderá aumentarAttributeError
internamente. É por isso que, em quase todas as situações reais como essa,getattr
é preferível a umhasattr
ou a outroAttributeError
.Você pode usar
hasattr()
ou capturarAttributeError
, mas se você realmente deseja apenas o valor do atributo com um padrão, se ele não estiver lá, a melhor opção é usargetattr()
:fonte
Eu acho que o que você está procurando é hasattr . No entanto, eu recomendaria algo assim se você quiser detectar propriedades python -
A desvantagem aqui é que os erros de atributo no
__get__
código de propriedades também são capturados.Caso contrário,
Documentos: http://docs.python.org/library/functions.html
Aviso:
O motivo da minha recomendação é que o hasattr não detecta propriedades.
Link: http://mail.python.org/pipermail/python-dev/2005-December/058498.html
fonte
hasattr
detecta propriedades em geral muito bem. É apenas que trata de gerar uma exceção naproperty
função -wrapped como significando que esse atributo não existe; a postagem da lista de discussão em Python vinculada é sobre uma propriedade que gera uma exceção quando você tenta acessá-la. Para todos os fins práticos, o referido atributo não existe, porque nunca produzirá um valor. Além disso,hasattr
apenas suprime exceções em geral no Py 3.1 e versões anteriores; em 3.2+, apenas suprime (substituindo porFalse
return)AttributeError
.De acordo com o pydoc, o hasattr (obj, prop) simplesmente chama getattr (obj, prop) e captura exceções. Portanto, é tão válido envolver o acesso ao atributo com uma instrução try e capturar o AttributeError quanto usar hasattr () antecipadamente.
fonte
hasattr
quandoSomeClass
substituições,__getattr__
poishasattr
capturará todas as exceções no Python 2.x, não exatamenteAttributeError
como você esperaria. Isso foi corrigido no Python 3.2 - consulte minha outra resposta para uma solução alternativa simples.Eu gostaria de sugerir evitar isso:
O usuário @jpalecek mencionou: Se
AttributeError
ocorrer um dentrodoStuff()
, você estará perdido.Talvez essa abordagem seja melhor:
fonte
Dependendo da situação, você pode verificar com
isinstance
que tipo de objeto você possui e, em seguida, usar os atributos correspondentes. Com a introdução de classes base abstratas no Python 2.6 / 3.0, essa abordagem também se tornou muito mais poderosa (basicamente os ABCs permitem uma maneira mais sofisticada de digitação de patos).Uma situação em que isso é útil seria se dois objetos diferentes tivessem um atributo com o mesmo nome, mas com significado diferente. Usando apenas
hasattr
pode levar a erros estranhos.Um bom exemplo é a distinção entre iteradores e iterables (consulte esta pergunta). Os
__iter__
métodos em um iterador e um iterável têm o mesmo nome, mas são semanticamente bem diferentes! Entãohasattr
é inútil, masisinstance
junto com o ABC fornece uma solução limpa.No entanto, concordo que, na maioria das situações, a
hasattr
abordagem (descrita em outras respostas) é a solução mais apropriada.fonte
Espero que você esteja esperando hasattr (), mas tente evitar hasattr () e, por favor, prefira getattr (). getattr () é mais rápido que hasattr ()
usando hasattr ():
mesmo aqui estou usando getattr para obter propriedade, se não houver propriedade, ele retornará nenhum
fonte
EDIT : Esta abordagem tem sérias limitações. Deverá funcionar se o objeto for iterável . Por favor, verifique os comentários abaixo.
Se você estiver usando o Python 3.6 ou superior como eu, há uma alternativa conveniente para verificar se um objeto tem um atributo específico:
No entanto, não tenho certeza de qual é a melhor abordagem no momento. usando
hasattr()
, usandogetattr()
ou usandoin
. Comentários são bem-vindos.fonte
in
A palavra-chave funciona para verificar tipos iteráveis. Por exemplo,'foo' in None
lança o erroTypeError: argument of type 'NoneType' is not iterable
. A correção é verificar se o tipo é iterável antes de usarin
. Depois de corrigir casos de arestas como o tipo não iterável, você provavelmente está melhor usando,hasattr()
pois ele foi projetado para lidar com casos de arestas.dict
como um "objeto leve", semelhante ao design de objetos JavaScript, mas a maioria das classes normais não suportará isso em geral (obtendo uma variante do erro mencionado por @SethDifley) .Aqui está uma abordagem muito intuitiva:
fonte
Isso é super simples, basta usar o
dir(
objeto.)
Isso retornará uma lista de todas as funções e atributos disponíveis do objeto.
fonte
Outra opção possível, mas depende se o que você quer dizer com antes :
resultado:
Isso permite que você verifique se há atributos sem valor.
Mas! Tenha muito cuidado para não instanciar acidentalmente e comparar
undefined
vários locais, porqueis
nunca funcionará nesse caso.Atualizar:
por causa do que eu estava avisando no parágrafo acima, tendo vários indefinidos que nunca correspondem, recentemente modifiquei ligeiramente esse padrão:
undefined = NotImplemented
NotImplemented
, para não confundirNotImplementedError
, é um built-in: ele combina semitendamente a intenção de um JSundefined
e você pode reutilizar sua definição em qualquer lugar e sempre corresponderá. A desvantagem é que ele é "verdadeiro" nos booleanos e pode parecer estranho nos logs e nos rastreamentos de pilha (mas você rapidamente supera isso quando sabe que só aparece nesse contexto).fonte
Você pode verificar se
object
contém atributo usando ohasattr
método interno.Por exemplo, se seu objeto é
a
e você deseja verificar o atributostuff
A própria assinatura do método é
hasattr(object, name) -> bool
o que significa que seobject
tem atributo que é passado para o segundo argumento emhasattr
que ele dá booleanaTrue
ouFalse
de acordo com a presença dename
atributo no objecto.fonte
hasattr()
é a resposta certa. O que eu quero acrescentar é quehasattr()
também pode ser usado bem em conjunto com assert (para evitarif
declarações desnecessárias e tornar o código mais legível):Conforme indicado em outra resposta no SO : As declarações devem ser usadas para testar condições que nunca devem acontecer. O objetivo é travar no início no caso de um estado de programa corrompido.
fonte
hasattr
não o código circundante.