Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

scanner la RAM et mettre dans un dico {nom_objet:adresse}

+1 vote
>>> class sympa():
...     def __init__(self):
...         pass

>>> a = sympa()

>>> a
<__main__.sympa object at 0x7fbf66eafc18>

Je voudrai repertorier tous les objets dans la memoire, filtrer selon la nature de
l' objet, et mettre ça dans un dictionnaire avec le nom de l' objet en clef et son adresse en valeur.
exemple :

dico_objets_gentils = {'a':0x7fbf66eafc18}
demandé 9-Nov-2016 par buffalo974 (2,570 points)

1 Réponse

+3 votes
 
Meilleure réponse

Trouver l'adresse d'un objet, c'est pas si évident.

repertorier tous les objets dans la memoire n'est pas une opération standard. On va se limiter aux objets du programme en cours, et encore, j'ignore les méthodes magiques parce que c'est comme la physique quantique : au bout d'un moment les règles sont plus les mêmes.

Et comme j'ai pas envie de faire du multi plateforme, je prendrais l'adresse avec id.

Enfin, je fais ça parce que c'est rigolo, mais si j'étais courageux j'irais faire de la biblio.

Voilà le code:

def recAccess(obj:object, namespace, out:dict) -> dict:
    subsnames = (sn for sn in dir(obj) if not (sn.startswith('__') and sn.endswith('__')))
    for subname in subsnames:
        subobj = getattr(obj, subname)
        if subobj == obj: continue
        subspc = namespace + '.' + subname
        subval = id(subobj)
        if subval not in out:
            out[subval] = subspc
            recAccess(subobj, subspc, out)
    return out


def objects():
    adresses = {}
    for name, obj in tuple(globals().items()):
        recAccess(obj, name, adresses)
    return {obj: addr for addr, obj in adresses.items()}


# import random
# import collections
print(len(objects()))

Perso, j'ai 419 objets répertoriés. 536 si j'importe random, et 1220 avec collections.

répondu 9-Nov-2016 par lucas (2,234 points)
sélectionné 10-Nov-2016 par buffalo974
...