dir(re.compile(pattern))
не возвращает шаблон как один из элементов списков. А именно это возвращает:
['__copy__', '__deepcopy__', 'findall', 'finditer', 'match', 'scanner', 'search', 'split', 'sub', 'subn']
Согласно руководству, он должен содержать
имена атрибутов объекта, имена атрибутов его класса и рекурсивные атрибуты базовых классов его класса.
Это также говорит о том, что
Список не обязательно завершен.
Есть ли способ получить полный список? Я всегда предполагал, что dir возвращает полный список, но, видимо, это не так ...
Также: есть ли способ перечислить только атрибуты? Или только методы?
Изменить: это на самом деле ошибка в Python -> предположительно это исправлено в ветке 3.0 (и, возможно, также в 2.6)
dir()
или проверка модуля, как правило, является правильным способом сделать это. Вы использовалиre
модуль просто в качестве примера или хотите достичь особой цели?__dir__()
Ответы:
Для полного списка атрибутов, краткий ответ: нет. Проблема заключается в том, что атрибуты фактически определяются как аргументы, принимаемые
getattr
встроенной функцией. Поскольку пользователь может переопределить__getattr__
, внезапно разрешив любой вид атрибута, нет никакого общего способа создания этого списка.dir
Функция возвращает ключи в__dict__
атрибуте, то есть все атрибуты доступны , если__getattr__
метод не переопределяется.По второму вопросу это не имеет смысла. На самом деле, методы являются вызываемыми атрибутами, не более того. Вы можете фильтровать вызываемые атрибуты и, используя
inspect
модуль, определять методы, методы или функции класса.источник
Вот почему новый
__dir__()
метод был добавлен в Python 2.6видеть:
источник
__dir
__ () - это метод объекта, а не функция - пожалуйста, прочитайте ссылки в ответе, и этоpprint({k:getattr(ojb,k) for k in obj.__dir__()})
Вот практическое дополнение к ответам PierreBdR и Мо:
dir()
кажется, достаточно.Для классов старого стиля мы можем, по крайней мере, сделать то, что делает стандартный модуль для поддержки завершения табуляции: в дополнение к
dir()
поиску__class__
, а затем перейти к его__bases__
:(Тест - код и выход удалены для краткости, но в основном для нового стиля объектов мы , кажется, имеют те же результаты для ,
get_object_attrs()
как дляdir()
, так и для классов старого стиля главного дополнения кdir()
выходу , как представляется,__class__
атрибут) .источник
Только для дополнения:
dir()
это самый мощный / фундаментальный инструмент. ( Рекомендуется )Кроме решения
dir()
просто обеспечивает свой путь в деле выводаdir()
.Перечислять атрибуты 2-го уровня или нет, важно сделать отсеивание самостоятельно, потому что иногда вы можете захотеть отсеять внутренние переменные с начальными подчеркиваниями
__
, но иногда вам может понадобиться__doc__
строка документации.__dir__()
иdir()
возвращает идентичный контент.__dict__
иdir()
разные.__dict__
возвращает неполное содержание.ВАЖНО :
__dir__()
иногда автор может перезаписать его функцией, значением или типом для любых целей.Вот пример:
TypeError: дескриптор
__dir__
из'object'
объекта нужен аргументАвтор PyTorch изменил
__dir__()
метод до чего-то, что требует аргумента. Эта модификация даетdir()
сбой.Если вы хотите, чтобы надежная схема проходила через все атрибуты объекта, помните, что каждый питонический стандарт может быть переопределен и может не выполняться , а каждое соглашение может быть ненадежным.
источник
Вот как я это делаю, полезно для простых пользовательских объектов, к которым вы продолжаете добавлять атрибуты:
Данный объект создан с помощью
obj = type("Obj",(object,),{})
или просто:Добавьте некоторые атрибуты:
затем, чтобы получить словарь только с пользовательскими атрибутами:
источник