hdir — Highlight dir

hdir() est une version colorée de la fonction dir()

Dépendances

Utilisation

pip install hdir

Invoquer hdir() sans argument affiche la légende :

>>> from hdir import *
>>> hdir()
abstract class {dict} exception function instance [list] module number other python() {set} 'string' (tuple) <wrapper>

hdir() ne coupe pas les mots et les trie par ordre alphabétique en respectant la casse. Comparons la fonction dir() classique avec hdir() sur le module builtins :

>>> import builtins
>>> dir(builtins)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']
>>> hdir(builtins)
ArithmeticError AssertionError AttributeError BaseException BlockingIOError BrokenPipeError BufferError BytesWarning ChildProcessError ConnectionAbortedError ConnectionError ConnectionRefusedError ConnectionResetError DeprecationWarning EOFError Ellipsis EnvironmentError Exception False FileExistsError FileNotFoundError FloatingPointError FutureWarning GeneratorExit IOError ImportError ImportWarning IndentationError IndexError InterruptedError IsADirectoryError KeyError KeyboardInterrupt LookupError MemoryError ModuleNotFoundError NameError None NotADirectoryError NotImplemented NotImplementedError OSError OverflowError PendingDeprecationWarning PermissionError ProcessLookupError RecursionError ReferenceError ResourceWarning RuntimeError RuntimeWarning StopAsyncIteration StopIteration SyntaxError SyntaxWarning SystemError SystemExit TabError TimeoutError True TypeError UnboundLocalError UnicodeDecodeError UnicodeEncodeError UnicodeError UnicodeTranslateError UnicodeWarning UserWarning ValueError Warning WindowsError ZeroDivisionError abs all any ascii bin bool breakpoint bytearray bytes callable chr classmethod compile complex copyright credits delattr dict dir divmod enumerate eval exec exit filter float format frozenset getattr globals hasattr hash help hex id input int isinstance issubclass iter len license list locals map max memoryview min next object oct open ord pow print property quit range repr reversed round set setattr slice sorted staticmethod str sum super tuple type vars zip

type.__dict__ est un proxy <> vers un dict {} dont le premier élément est un descripteur <> vers une fonction (cyan) :

>>> hdir(type, 'a')
... <{<__dict__>}> ...

Couleur

Couleur Type
Bleu int, float, bool, complex
Cyan fonction ou méthode
Vert chaîne
Magenta module
Rouge exception
Jaune classe autre qu’exception
Style Signification Windows [1] Mintty Linux FB GNOME, KDE
Couleur type [2]
Gras est réel [3]
Italique est abstrait    
Souligné d’instance  
[1] HKCU\Console\VirtualTerminalLevel = 1 active les couleurs ANSI sauf le jaune foncé
[2] Si c’est un conteneur, couleur du premier élément
[3] Ni abstrait ni caché par un descripteur ou proxy

Décorateurs

Decorateurs Type Récursif
'...' chaîne  
[...] liste
(...) tuple
{...} dict ou ensemble
<...> descripteur ou proxy
...() fonction utilisateur [4]  
[4] Écrite en langage Python, ni intégrée ni fonction de librairie du langage C

Variable d’instance

hdir() souligne les variables d’instance. Dans cet exemple, la variable d’instance msg recouvre la variable de classe du même nom :

>>> class C:
      msg = ['Hello world', 'Goodbye']
      age = {'Alice': 31, 'Bob': 39}
>>> hdir(C)
{age} ['msg']
>>> obj = C()
>>> obj.msg = obj.msg + ['Regards']
>>> obj.ready = True
>>> hdir(obj)
{age} ['msg'] ready
>>> obj.msg
['Hello world', 'Goodbye', 'Regards']
>>> C.msg
['Hello world', 'Goodbye']

Drapeaux

hdir() cache les attributs __double __magic__ _private à moins que les drapeaux 'd' 'm' 'p' soient présents :

>>> from collections import abc
>>> hdir(abc, 'm')
AsyncGenerator AsyncIterable AsyncIterator Awaitable ByteString Callable Collection Container Coroutine Generator Hashable ItemsView Iterable Iterator KeysView Mapping MappingView MutableMapping MutableSequence MutableSet Reversible Sequence Set Sized ValuesView ['__all__'] {'__builtins__'} '__cached__' __doc__ '__file__' __loader__ '__name__' '__package__' __spec__

Le drapeau 'a' « all » équivaut à 'dmp', bien que les éléments abstraits soient toujours visibles :

>>> hdir(abc.Set)
__contains__ __iter__ __len__ isdisjoint()
>>> hdir(abc.Set, 'a')
{'__abstractmethods__'} __and__() __class__ __contains__ <__delattr__> <__dir__> '__doc__' __eq__() <__format__> __ge__() <__getattribute__> __gt__() __hash__ <__init__> __init_subclass__ __iter__ __le__() __len__ __lt__() '__module__' <__ne__> __new__ __or__() __rand__() <__reduce__> <__reduce_ex__> <__repr__> __ror__() __rsub__() __rxor__() <__setattr__> <__sizeof__> (__slots__) <__str__> __sub__() __subclasshook__() __xor__() _abc_impl _from_iterable() _hash() isdisjoint()

Le drapeau 'n' « no-color » désactive les codes ANSI mais conserve les décorateurs :

import re
>>> hdir(re)
A ASCII DEBUG DOTALL I IGNORECASE L LOCALE M MULTILINE Match Pattern RegexFlag S Scanner T TEMPLATE U UNICODE VERBOSE X compile() copyreg enum error escape() findall() finditer() fullmatch() functools match() purge() search() split() sre_compile sre_parse sub() subn() template()
>>> hdir(re, 'n')
A ASCII DEBUG DOTALL I IGNORECASE L LOCALE M MULTILINE Match Pattern RegexFlag S Scanner T TEMPLATE U UNICODE VERBOSE X compile() copyreg enum error escape() findall() finditer() fullmatch() functools match() purge() search() split() sre_compile sre_parse sub() subn() template()

Le drapeau 'r' « raw » retourne un dict dans le style de vars() pour profiter du filtrage d’attributs :

>>> len(vars(re)), len(hdir(re, 'r'))
(58, 39)

Aucun faux positif

Alors que dir(), vars() et inspect.getmembers() retournent certains attributs qui n’existent pas, hdir() teste chaque attribut avec hasattr() pour éliminer les faux positifs :

>>> from inspect import getmembers
>>> attr = dir(type), vars(type), dict(getmembers(type)), hdir(type, 'ar')
>>> [len(a) for a in attr]
[43, 29, 43, 42]
>>> ['__abstractmethods__' in a for a in attr]
[True, True, True, False]
>>> type.__abstractmethods__
AttributeError: __abstractmethods__

Versions

0.5: 16 février 2019 — Première version bêta
0.4: 8 février 2019 — import * importe seulement hdir()
0.3: 7 février 2019 — Ajout de la légende, du drapeau 'r', support des wrappers
0.2: 5 février 2019 — Élimination des faux positifs
0.1: 5 février 2019 — Première version alpha