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)
enda 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()
Пример с модулем для просмотра его содержимого.
import math
print(dir(math)[:5]) # Первые 5 атрибутов['__doc__', '__loader__', '__name__', '__package__', '__spec__']
Использование __dir__ для управления выводом.
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() для класса и его экземпляра.
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() для поиска конкретных методов.
# Поиск всех методов строки, содержащих 'find'
string_methods = dir(str)
find_methods = [m for m in string_methods if 'find' in m]
print(find_methods)['find', 'rfind']
Использование dir() для отладки и исследования областей видимости.
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']
Взаимодействие с динамически созданными атрибутами.
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']