Есть ли способ в Python, чтобы определить, есть ли у объекта какой-либо атрибут? Например:
>>> 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'
Как вы можете определить, a
есть ли атрибут property
перед его использованием?
источник
import string hasattr(string, "lower")
hasattr
точно так же, как использованиеtry
/except AttributeError
: строка документации hasattr (в Python 2.7) говорит, что она использует getattr для ловли исключений вручную.hasattr
к сожалению, это не совсем то же самое, что иtry: ... except AttributeError:
в Python 2.x, такhasattr
как перехватит все исключения . Пожалуйста, посмотрите мой ответ для примера и простого обходного пути.Как ответил Джаррет Харди , все
hasattr
получится. Я хотел бы добавить, однако, что многие в сообществе Python рекомендуют стратегию «проще просить прощения, чем разрешения» (EAFP), а не «смотреть перед прыжком» (LBYL). Смотрите эти ссылки:EAFP против LBYL (пока Re: немного разочарован)
EAFP против LBYL @Code Как Pythonista: Идиоматический Python
то есть:
... предпочтительнее:
источник
try:
должна быть попыткой доступа к атрибуту; нет никаких причин, чтобы обернуть выполнениеdoStuff
также. Тем не менее, существует некоторая возможность для двусмысленности: еслиproperty
вычисляемое свойство вместо простого атрибута, его реализация может возникнутьAttributeError
внутри. Вот почему почти во всех реальных ситуациях, подобных этой,getattr
предпочтительнее либоhasattr
ловить, либо ловитьAttributeError
.Вы можете использовать
hasattr()
или пойматьAttributeError
, но если вам действительно нужно значение атрибута со значением по умолчанию, если его там нет, лучшим вариантом будет просто использоватьgetattr()
:источник
Я думаю, что вы ищете, это hasattr . Тем не менее, я бы порекомендовал что-то подобное, если вы хотите обнаружить свойства Python -
Недостатком здесь является то, что ошибки атрибутов в
__get__
коде свойств также отлавливаются.В противном случае,
Документы: http://docs.python.org/library/functions.html
Предупреждение
. Моя рекомендация заключается в том, что hasattr не определяет свойства.
Ссылка: http://mail.python.org/pipermail/python-dev/2005-De December/ 058498.html
источник
hasattr
обнаруживает свойства в целом просто отлично. Просто он обрабатывает возникновение исключения вproperty
функции -wrapped как означающее, что такого атрибута не существует; Связанный пост списка рассылки Python о свойстве, которое вызывает исключение при попытке доступа к нему. Для всех практических целей указанный атрибут не существует, потому что он никогда не будет создавать значение. Кроме того,hasattr
подавляет только исключения вообще на Py 3.1 и ранее; в 3.2+ он только подавляет (замена наFalse
возврат)AttributeError
.Согласно pydoc, hasattr (obj, prop) просто вызывает getattr (obj, prop) и перехватывает исключения. Таким образом, столь же правильно обернуть доступ к атрибуту оператором try и перехватить AttributeError, как и использовать hasattr () заранее.
источник
hasattr
приSomeClass
переопределении,__getattr__
посколькуhasattr
перехватывает все исключения в Python 2.x, а не так,AttributeError
как вы ожидаете. Это было исправлено в Python 3.2 - смотрите мой другой ответ для простого обходного пути.Я хотел бы предложить избежать этого:
Пользователь @jpalecek упомянул это: если
AttributeError
происходит внутриdoStuff()
, вы потерялись.Может быть, этот подход лучше:
источник
В зависимости от ситуации вы можете проверить,
isinstance
какой у вас объект, а затем использовать соответствующие атрибуты. С введением абстрактных базовых классов в Python 2.6 / 3.0 этот подход также стал намного более мощным (в основном ABC допускают более изощренный способ типизации утки).Одна из этих ситуаций была бы полезной, если бы два разных объекта имели атрибут с одинаковым именем, но с разным значением. Использование только
hasattr
может привести к странным ошибкам.Хорошим примером является различие между итераторами и итераторами (см. Этот вопрос). Эти
__iter__
методы в итератор и итератор имеют одинаковые имена , но семантически совершенно разные! Такhasattr
бесполезно, ноisinstance
вместе с АВС обеспечивает чистое решение.Однако я согласен, что в большинстве ситуаций
hasattr
подход (описанный в других ответах) является наиболее подходящим решением.источник
Надеюсь, вы ожидаете hasattr (), но старайтесь избегать hasattr () и, пожалуйста, предпочитайте getattr (). getattr () быстрее, чем hasattr ()
используя hasattr ():
то же самое здесь я использую getattr, чтобы получить свойство, если нет свойства, оно не возвращает
источник
РЕДАКТИРОВАТЬ : этот подход имеет серьезные ограничения. Это должно работать, если объект является повторяемым . Пожалуйста, проверьте комментарии ниже.
Если вы используете Python 3.6 или выше, как я, есть удобная альтернатива, чтобы проверить, имеет ли объект определенный атрибут:
Однако я не уверен, какой сейчас самый лучший подход. использование
hasattr()
, использованиеgetattr()
или использованиеin
. Комментарии приветствуются.источник
in
Ключевое слово работает для проверки итерируемых типов. Например,'foo' in None
выдает ошибкуTypeError: argument of type 'NoneType' is not iterable
. Исправление состоит в том, чтобы проверить, является ли тип повторяемым перед использованиемin
. После исправления для крайних случаев, таких как не повторяемый тип, вам, вероятно, лучше использовать,hasattr()
поскольку он предназначен для обработки крайних случаев.dict
в качестве «легковесного объекта», подобного дизайну объектов JavaScript, но большинство обычных классов не будет поддерживать это в целом (получение варианта ошибки, упомянутой @SethDifley) ,Вот очень интуитивный подход:
источник
Это очень просто, просто используйте
dir(
объект.)
Это вернет список всех доступных функций и атрибутов объекта.
источник
Другой возможный вариант, но это зависит от того , что вы подразумеваете , прежде чем :
вывод:
Это позволяет вам даже проверять None-значимые атрибуты.
Но! Будьте очень осторожны, вы не случайно создадите и сравните
undefined
несколько мест, потому чтоis
в этом случае они никогда не сработают.Обновить:
из-за того, о чем я предупреждал в предыдущем абзаце, имея несколько неопределенных, которые никогда не совпадают, я недавно немного изменил этот шаблон:
undefined = NotImplemented
NotImplemented
, не путать сNotImplementedError
, является встроенным: он почти соответствует цели JS,undefined
и вы можете использовать его определение везде, и оно всегда будет совпадать. Недостатки в том, что он «правдив» в логических значениях и может выглядеть странно в журналах и трассировках стека (но вы быстро справляетесь с этим, когда знаете, что он появляется только в этом контексте).источник
Вы можете проверить,
object
содержит ли атрибут, используяhasattr
встроенный метод.Например, если ваш объект
a
и вы хотите проверить атрибутstuff
Сама сигнатура метода
hasattr(object, name) -> bool
означает, чтоobject
имеет атрибут, который передается второму аргументу,hasattr
чем он дает логическое значение,True
или вFalse
соответствии с наличиемname
атрибута в объекте.источник
hasattr()
это правильный ответ. Что я хочу добавить, так это то, что онhasattr()
также может быть использован в сочетании с assert (чтобы избежать ненужныхif
утверждений и сделать код более читабельным):Как указано в другом ответе на SO : утверждения должны использоваться для проверки условий, которые никогда не должны возникать. Целью является ранний сбой в случае повреждения программы.
источник
hasattr
не окружающего кода.