hdir
— Highlight dir¶
hdir()
est une version colorée de la fonction dir()
Dépendances¶
- Python 3.6+
- Console avec couleurs ANSI
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 |