dir(re.compile(pattern))
не возвращает шаблон как один из элементов списков. А именно возвращает:
['__copy__', '__deepcopy__', 'findall', 'finditer', 'match', 'scanner', 'search', 'split', 'sub', 'subn']
Согласно инструкции, он должен содержать
the object's attributes' names, the names of its class's attributes, and recursively of the attributes of its class's base classes.
Он также говорит, что
The list is not necessarily complete.
Есть ли способ получить список полный? Я всегда предполагал, что dir возвращает полный список, но, видимо, это не так ...
Также: есть ли способ перечислить только атрибуты? Или только методы?
Обновлено: на самом деле это ошибка в python → предположительно исправлена в ветке 3.0 (и, возможно, также в 2.6)
Вы уверены, что шаблон действительно сохраняется как данные после компиляции? У меня создалось впечатление, что целью компиляции шаблона было создание конечных автоматов, необходимых для анализа данного шаблона.
@hop нельзя обойти классами? Например, их можно сделать на __dir__().
ytpillai: правильно, но только в Python 3. Тем не менее, вопрос в том, попадет ли такой класс под «общий случай»






Для списка атрибутов полный краткий ответ: нет. Проблема в том, что атрибуты фактически определены как аргументы, принимаемые встроенной функцией getattr. Поскольку пользователь может повторно реализовать __getattr__, внезапно разрешив любой тип атрибута, не существует универсального способа сгенерировать этот список. Функция dir возвращает ключи в атрибуте __dict__, то есть все атрибуты, доступные, если метод __getattr__ не реализован повторно.
Что касается второго вопроса, это не имеет смысла. Фактически, методы - это вызываемые атрибуты, не более того. Вы можете фильтровать вызываемые атрибуты и с помощью модуля inspect определять методы, методы или функции класса.
inspect.getmembers (re.compile (pattern)) также не передает шаблон в качестве члена, поэтому он, вероятно, внутренне использует dir ... Это отстой!
Я также мог бы использовать callable, чтобы проверить, являются ли они методами, но дело не в этом ... Дело в том, что я не могу доверять dir, чтобы он возвращал даже список атрибутов, которые фактически общедоступны ...
inspect должен быть "не менее" надежным, чем dir (). с другой стороны, re - очень сложный модуль
Что вы определяете под «общедоступным»? Если вы имеете в виду «можно получить доступ», то это безнадежное дело по указанной причине. В противном случае dir всегда возвращает список атрибутов, доступных с реализацией getattr по умолчанию.
Что ж, взгляните на другой ответ. В ppython есть некоторое понятие публичной видимости, отсюда и реж, чтобы объекты могли контролировать то, что возвращается. Тем не менее, я столкнулся с этой проблемой, потому что я использую dir в интерактивной оболочке, например все время: D. Во всяком случае, да.
dir (my_class) возвращает что-то отличное от my_class .__ dict __. keys (). первый также выводит методы класса, такие как в этом и док
Что насчет help()? :П
Вот почему в python 2.6 был добавлен новый метод __dir__().
видеть:
Я получаю такую ошибку: >> dir __ (pyrenderdoc) Traceback (последний вызов последним): файл «<string>», строка 1, в <module> NameError: name '__dir 'не определено
__dir __ () - это метод объекта, а не функция - прочтите ссылки в ответе и это
Однострочник для печати всех атрибутов и их значений: pprint({k:getattr(ojb,k) for k in obj.__dir__()})
Вот практическое дополнение к ответам PierreBdR и Moe:
dir() кажется достаточно.Для уроки старого стиля мы можем, по крайней мере, сделать то, что делает стандартный модуль для поддержки завершения табуляции: в дополнение к dir() ищите __class__, а затем перейдите к его __bases__:
# code borrowed from the rlcompleter module
# tested under Python 2.6 ( sys.version = '2.6.5 (r265:79063, Apr 16 2010, 13:09:56) \n[GCC 4.4.3]' )
# or: from rlcompleter import get_class_members
def get_class_members(klass):
ret = dir(klass)
if hasattr(klass,'__bases__'):
for base in klass.__bases__:
ret = ret + get_class_members(base)
return ret
def uniq( seq ):
""" the 'set()' way ( use dict when there's no set ) """
return list(set(seq))
def get_object_attrs( obj ):
# code borrowed from the rlcompleter module ( see the code for Completer::attr_matches() )
ret = dir( obj )
## if "__builtins__" in ret:
## ret.remove("__builtins__")
if hasattr( obj, '__class__'):
ret.append('__class__')
ret.extend( get_class_members(obj.__class__) )
ret = uniq( ret )
return ret
(Тестовый код и выходные данные удалены для краткости, но в основном для объектов нового стиля у нас, похоже, те же результаты для get_object_attrs(), что и для dir(), а для классов старого стиля основным дополнением к выходным данным dir() является атрибут __class__. )
Вот как я это делаю, полезно для простых настраиваемых объектов, к которым вы продолжаете добавлять атрибуты:
Учитывая объект, созданный с помощью obj = type("Obj",(object,),{}), или просто:
class Obj: pass
obj = Obj()
Добавьте некоторые атрибуты:
obj.name = 'gary'
obj.age = 32
затем, чтобы получить словарь только с настраиваемыми атрибутами:
{key: value for key, value in obj.__dict__.items() if not key.startswith("__")}
# {'name': 'gary', 'age': 32}
список всех атрибутов в Python 3.x: {ключ: значение для ключа, значение в obj .__ dict __. items (), если не key.startswith ("__")} ['_ декларированные_поля']. keys ()
Только в дополнение:
dir() - мощный / фундаментальный инструмент самый. (Наиболее рекомендуемый)Решения, отличные от dir(), просто предоставляют их путь обработки выход dir().
Перечисляя атрибуты 2-го уровня или нет, важно выполнить просеивание самостоятельно, потому что иногда вам может потребоваться отсеять внутренние переменные с ведущими символами подчеркивания __, но иногда вам может потребоваться строка документа __doc__.
__dir__() и dir() возвращают идентичный контент.__dict__ и dir() разные. __dict__ возвращает неполное содержимое.ВАЖНЫЙ: __dir__() может быть иногда перезаписан автором функцией, значением или типом для любых целей.
Вот пример:
\...\torchfun.py in traverse(self, mod, search_attributes)
445 if prefix in traversed_mod_names:
446 continue
447 names = dir(m)
448 for name in names:
449 obj = getattr(m,name)
TypeError: дескриптору __dir__ объекта 'object' требуется аргумент
Автор PyTorch изменил метод __dir__() на то, что требует аргумента. Эта модификация приводит к отказу dir().
Если вы хотите, чтобы схема надежный проходила через все атрибуты объекта, помните, что каждый питонический стандарт может быть отменено и не может удерживаться и все соглашения могут быть ненадежными.
использование
dir()или модуля inspect обычно является правильным способом сделать это. Вы использовали модульreтолько в качестве примера или хотите достичь особой цели?