Dir: примеры (PYTHON)

Функция dir в Python: руководство с практическими примерами
Раздел: Встроенные функции, Интроспекция
dir([object]): list

Описание функции dir() в Python

Функция dir() является встроенной функцией Python, которая возвращает список валидных атрибутов указанного объекта. Она помогает в интроспекции, позволяя исследовать, какие методы и свойства доступны для объекта или модуля. Функция часто используется в интерактивной оболочке для изучения возможностей объектов и модулей.

Аргументы

Функция принимает один необязательный аргумент.

  • object (объект, опционально): Объект, атрибуты которого нужно перечислить. Это может быть любой объект Python: модуль, класс, экземпляр, или любой другой объект с атрибутами. Если аргумент не передан, функция возвращает имена в текущей локальной области видимости.

Возвращаемое значение

Функция возвращает список строк, представляющих имена атрибутов переданного объекта. Порядок элементов в списке может быть произвольным. Если объект имеет метод __dir__(), он будет вызван для получения списка атрибутов. В противном случае функция пытается собрать информацию из атрибута __dict__ и объекта типа.

Простые примеры использования dir()

Пример без аргументов показывает имена в текущей локальной области видимости.

>>> x = 1
>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x']

Пример с целым числом демонстрирует его методы.

>>> dir(5)
['__abs__', '__add__', '__and__', ... , 'imag', 'numerator', 'real', 'to_bytes']

Пример со строкой показывает её атрибуты.

>>> dir('hello')
['__add__', '__class__', '__contains__', ... , 'title', 'translate', 'upper', 'zfill']

Пример с пользовательским классом.

class MyClass:
    def __init__(self):
        self.value = 10
    def show(self):
        print(self.value)

obj = MyClass()
print(dir(obj))
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'show', 'value']

Похожие функции в Python

  • vars(object): Возвращает словарь __dict__ переданного объекта (если он есть). Полезно для получения атрибутов экземпляра в виде пар ключ-значение. Если аргумент не передан, возвращает локальную область видимости, аналогично locals().
  • help(object): Запускает встроенную систему помощи, предоставляя более детальную документацию об объекте, чем простой список имен от dir().
  • object.__dict__: Прямой доступ к пространству имен объекта. Работает только для объектов, имеющих этот атрибут (например, экземпляры классов).
  • inspect модуль: Предоставляет более мощные и детализированные средства для интроспекции, такие как inspect.getmembers().

Функцию dir() предпочтительнее использовать для быстрого просмотра доступных атрибутов в интерактивном режиме. Для получения значений атрибутов удобнее vars() или .__dict__. Для глубокого анализа структуры кода подходит модуль inspect.

Аналоги функции dir() в других языках

JavaScript

Методы Object.keys(), Object.getOwnPropertyNames() и Reflect.ownKeys() возвращают список свойств объекта.

const obj = { a: 1, b: 2 };
console.log(Object.keys(obj));
console.log(Object.getOwnPropertyNames(obj));
['a', 'b']
['a', 'b']

PHP

Функция get_class_methods() возвращает методы класса, а get_object_vars() - свойства экземпляра.

class MyClass {
    public $prop = 'val';
    public function method() {}
}
$obj = new MyClass();
print_r(get_class_methods($obj));
print_r(get_object_vars($obj));
Array
(
    [0] => method
)
Array
(
    [prop] => val
)

Java

Используется механизм Reflection API через класс Class.

import java.lang.reflect.*;

public class Main {
    public static void main(String[] args) {
        Class<?> c = String.class;
        Method[] methods = c.getMethods();
        for (Method m : methods) {
            System.out.println(m.getName());
        }
    }
}
// Вывод списка методов класса String

C#

Используется пространство имен System.Reflection.

using System;
using System.Reflection;

class Program {
    static void Main() {
        Type t = typeof(string);
        MemberInfo[] members = t.GetMembers();
        foreach (MemberInfo member in members) {
            Console.WriteLine(member.Name);
        }
    }
}
// Вывод списка членов класса String

Lua

Нет прямой аналогии. Для таблиц можно использовать цикл pairs.

local t = { a = 1, b = 2 }
for key, _ in pairs(t) do
    print(key)
end
a
b

Go

Рефлексия осуществляется через пакет reflect.

package main

import (
    "fmt"
    "reflect"
)

func main() {
    s := "hello"
    t := reflect.TypeOf(s)
    fmt.Println(t.Method())
}

Kotlin

Используется рефлексия Kotlin (KClass) или Java Reflection.

import kotlin.reflect.full.memberProperties

class MyClass(val prop: String)

fun main() {
    val members = MyClass::class.memberProperties
    println(members.map { it.name })
}
[prop]

В отличие от Python, во многих языках для интроспекции требуется использовать специализированные API рефлексии, а не одну универсальную функцию.

Типичные ошибки при использовании dir()

Передача больше одного аргумента вызывает TypeError.

>>> dir([], {})
Traceback (most recent call last):
  File "", line 1, in 
TypeError: dir expected at most 1 argument, got 2

Попытка использовать dir() на объекте, где метод __dir__ возвращает не-итерируемый объект, вызовет TypeError.

class BadDir:
    def __dir__(self):
        return 42  # Должен возвращать последовательность

obj = BadDir()
dir(obj)
Traceback (most recent call last):
  ...
TypeError: __dir__() must return a list, not int

Важно понимать, что dir() не гарантирует полный список атрибутов. Объекты с динамически генерируемыми атрибутами через __getattr__ могут не отображать все возможности.

Изменения в функции dir()

В Python 3.3 появилась возможность определять метод __dir__ для модулей, что позволяет модулям контролировать результат вызова dir(module). Ранее метод __dir__ поддерживался только для экземпляров классов. Также улучшено согласованное поведение функции для различных типов объектов.

Расширенные примеры использования dir()

Пример с модулем для просмотра его содержимого.

Пример python
import math
print(dir(math)[:5])  # Первые 5 атрибутов
['__doc__', '__loader__', '__name__', '__package__', '__spec__']

Использование __dir__ для управления выводом.

Пример python
class CustomDir:
    def __init__(self):
        self.public = 'visible'
        self._private = 'hidden'
    def __dir__(self):
        # Возвращаем только публичные атрибуты
        return [attr for attr in super().__dir__() if not attr.startswith('_')]

obj = CustomDir()
print(dir(obj))
['public']

Сравнение вывода dir() для класса и его экземпляра.

Пример python
class Base:
    class_attr = 'class'
    def __init__(self):
        self.instance_attr = 'instance'

print('Class dir:', [x for x in dir(Base) if not x.startswith('__')])
obj = Base()
print('Instance dir:', [x for x in dir(obj) if not x.startswith('__')])
Class dir: ['class_attr']
Instance dir: ['class_attr', 'instance_attr']

Фильтрация результата dir() для поиска конкретных методов.

Пример python
# Поиск всех методов строки, содержащих 'find'
string_methods = dir(str)
find_methods = [m for m in string_methods if 'find' in m]
print(find_methods)
['find', 'rfind']

Использование dir() для отладки и исследования областей видимости.

Пример python
def test_function(a, b=2):
    local_var = 'test'
    print('Локальные переменные внутри функции:', [x for x in dir() if not x.startswith('__')])
    return a + b

test_function(1)
print('Глобальные переменные:', [x for x in dir() if not x.startswith('__')])
Локальные переменные внутри функции: ['a', 'b', 'local_var']
Глобальные переменные: ['test_function']

Взаимодействие с динамически созданными атрибутами.

Пример python
class Dynamic:
    pass

obj = Dynamic()
obj.a = 1
setattr(obj, 'b', 2)
print('После добавления a и b:', [x for x in dir(obj) if not x.startswith('__')])
del obj.a
print('После удаления a:', [x for x in dir(obj) if not x.startswith('__')])
После добавления a и b: ['a', 'b']
После удаления a: ['b']

питон dir function comments

En
Dir Return list of names in scope