Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Inverse de la fonction id()

7 réponses
Avatar
ReM
Bonjour,

Existe t il une fonction inverse à la fonction id() ?
Car je souhaite créer un tableau d'id et ensuite, via l'id retrouver mon
objet.
Ex :
i = 1
j = 2

t = [id(i), id(j) ]

for a in t:
var = ????(a)
print var

et le résultat est :
1
2

Merci pour votre aide....

7 réponses

Avatar
Laurent Pointal
Le Wed, 05 Dec 2007 18:01:02 +0100, ReM a écrit :

Bonjour,

Existe t il une fonction inverse à la fonction id() ? Car je souhaite
créer un tableau d'id et ensuite, via l'id retrouver mon objet.
Ex :
i = 1
j = 2

t = [id(i), id(j) ]
u = { id(i):i, id(j):j }


for a in t:
var = ????(a)
var = u[a]

print var

et le résultat est :
1
2

Merci pour votre aide....


Peux-tu préciser ce que tu veux faire qui nécessite de passer par les ids
des nombres ? il y a peut-être une solution plus adaptée/simple...





--
Laurent POINTAL -

Avatar
Méta-MCI \(MVP\)
Bonsoir !

Tu peux toujours construire un dictionnaire des ID
Exemple :

i = 1
j = 2
t = [id(i), id(j)]

did={}
import copy
for v in copy.copy(globals()):
did[id(globals()[v])]=v

for a in t:
var = globals()[did[a]]
print var



Mais, comme Laurent, je vois mal l'intérêt...

@-salutations
--
Michel claveau
Avatar
Bruno Desthuilliers
Bonjour,

Existe t il une fonction inverse à la fonction id() ?


Non. D'autant qu'un même id peut servir successivement à plusieurs objets:

a = []
b = []
id(a)
1081303532



id(b)
1081304396



del a
del b
c = []
id(c)
1081303532





Car je souhaite créer un tableau d'id et ensuite, via l'id retrouver mon
objet.

Ex :
i = 1
j = 2

t = [id(i), id(j) ]

for a in t:
var = ????(a)
print var

et le résultat est :
1
2


Utilise un dictionnaire:

d = {id(i):i, id(j):j}
for k in d:
var = d[k]
print var

Ceci étant, je bisse la question de Laurent: qu'est-ce donc que tu
essaie de faire au juste ???



Avatar
ReM
Bonjour,

Existe t il une fonction inverse à la fonction id() ?


Non. D'autant qu'un même id peut servir successivement à plusieurs objets:

a = []
b = []
id(a)
1081303532



id(b)
1081304396



del a
del b
c = []
id(c)
1081303532





Car je souhaite créer un tableau d'id et ensuite, via l'id retrouver
mon objet.

Ex :
i = 1
j = 2

t = [id(i), id(j) ]

for a in t:
var = ????(a)
print var

et le résultat est :
1
2


Utilise un dictionnaire:

d = {id(i):i, id(j):j}
for k in d:
var = d[k]
print var

Ceci étant, je bisse la question de Laurent: qu'est-ce donc que tu
essaie de faire au juste ???

Je vais prendre cette solution.


En fait j'ai surchargé la fonction __cmp__ des objets que j'utilise.
Ex :
class Objet():
def __int__(self, a, b ):
self.a = a
self.b = b

def __cmp__( self, objet ):
if self.a == objet.a:
return 0
return 1

donc si
o1 = Objet( 1, "toto" )
o2 = Objet( 1, "titi" )
o1 == o2
True
C'est le résultat que j'attends


ensuite je veux stocker ces objets dans un tableau :
tab = []
if o1 not in tab:
tab.append(o1)

if o2 not in tab:
tab.append(o2)

Et la l'objet o2 n'est pas inséré dans tab. Et moi je le voudrais !!!
Je sais que c'est ma fonction __cmp__ qui fout la merde mais je peux pas
la modifier.
Donc je me suis dis qu'en stockant les id dans mon tableau et en fait
appel à une fonction magique, j'aurais mon objet.

Je vais donc utiliser ce dictionnaire qui résoudra surement tous mes pbs.

Merci Bruno / Laurent / Michel




Avatar
Bruno Desthuilliers
(snip)
Ceci étant, je bisse la question de Laurent: qu'est-ce donc que tu
essaie de faire au juste ???



En fait j'ai surchargé la fonction __cmp__ des objets que j'utilise.
Ex :
class Objet():
def __int__(self, a, b ):
self.a = a
self.b = b

def __cmp__( self, objet ):
if self.a == objet.a:
return 0
return 1


Heu... Tu es sûr de bien avoir lu la doc de cette méthode ?

class Obj(object):
def __init__(self, a):
self.a = a

def __cmp__(self, other):
res = int(not self.a==other.a)
print "%s cmp %s => %s" % (self, other, res)
return res

def __repr__(self):
return "<%s>" % self.a

a = Obj(1)
b = Obj(2)
cmp(a, b)
=> <1> cmp <2> => 1
=> 1
cmp(1, 2)
=> -1


Pour info:

__cmp__( self, other)
Called by comparison operations if rich comparison (see above) is
not defined. Should return a negative integer if self < other, zero if
self == other, a positive integer if self > other.

Tu devrais donc plutôt utiliser:
def __cmp__(self, other):
return cmp(self.a, other.a)

mais attention: si tu tentes de comparer avec un other qui n'a pas
d'attribut 'a', tu va avoir une exception.

donc si
o1 = Objet( 1, "toto" )
o2 = Objet( 1, "titi" )
o1 == o2
True
C'est le résultat que j'attends




ensuite je veux stocker ces objets dans un tableau :
tab = []


<mode="pédant">
Dans une liste, donc !-)
</mode>

if o1 not in tab:
tab.append(o1)

if o2 not in tab:
tab.append(o2)


Effectivement, c'est ennuyeux... Et effectivement, pour une liste, le
test d'appartenance se base sur l'égalité, pas sur l'identité.

L'ordre d'insertion est-il important ? Sinon, il semble qu'un set fasse
ton affaire - en tous cas avec Python 2.4.3, mais je doute que ce soit
un accident :

class Obj2(object):
def __init__(self, a):
self.a = a

def __cmp__(self, other):
return cmp(self.a, other.a)

def __repr__(self):
return "<%s %s>" % (id(self), self.a)



a = Obj2(1); b=Obj2(2); c = Obj2(1)
a == b
False



a == c
True



l = [a, b]
c in l
True



s = set(l)
c in s
False



s
set([<1077128620 2>, <1077128716 1>])



s.add(c)
s
set([<1077128620 2>, <1077128716 1>, <1077128492 1>])



c in s
True








Je n'ai pas Python 2.5 installé ici, si qq'un pouvait confirmer ?



Avatar
ReM
(snip)
Ceci étant, je bisse la question de Laurent: qu'est-ce donc que tu
essaie de faire au juste ???



En fait j'ai surchargé la fonction __cmp__ des objets que j'utilise.
Ex :
class Objet():
def __int__(self, a, b ):
self.a = a
self.b = b
def __cmp__( self, objet ):
if self.a == objet.a:
return 0
return 1


Heu... Tu es sûr de bien avoir lu la doc de cette méthode ?

Heu... Non, il fallait ? ;o)


class Obj(object):
def __init__(self, a):
self.a = a

def __cmp__(self, other):
res = int(not self.a==other.a)
print "%s cmp %s => %s" % (self, other, res)
return res

def __repr__(self):
return "<%s>" % self.a

a = Obj(1)
b = Obj(2)
cmp(a, b)
=> <1> cmp <2> => 1
=> 1
cmp(1, 2)
=> -1


Pour info:

__cmp__( self, other)
Called by comparison operations if rich comparison (see above) is
not defined. Should return a negative integer if self < other, zero if
self == other, a positive integer if self > other.

Tu devrais donc plutôt utiliser:
def __cmp__(self, other):
return cmp(self.a, other.a)
OK Je prends...


mais attention: si tu tentes de comparer avec un other qui n'a pas
d'attribut 'a', tu va avoir une exception.

Normalement, impossible.....

donc si
o1 = Objet( 1, "toto" )
o2 = Objet( 1, "titi" )
o1 == o2
True
C'est le résultat que j'attends




ensuite je veux stocker ces objets dans un tableau :
tab = []


<mode="pédant">
Dans une liste, donc !-)
</mode>

if o1 not in tab:
tab.append(o1)

if o2 not in tab:
tab.append(o2)


Effectivement, c'est ennuyeux... Et effectivement, pour une liste, le
test d'appartenance se base sur l'égalité, pas sur l'identité.

L'ordre d'insertion est-il important ? Sinon, il semble qu'un set fasse
ton affaire - en tous cas avec Python 2.4.3, mais je doute que ce soit
un accident :


Non pas d'importance pour l'ordre, la liste est retraitée ensuite


class Obj2(object):
def __init__(self, a):
self.a = a

def __cmp__(self, other):
return cmp(self.a, other.a)

def __repr__(self):
return "<%s %s>" % (id(self), self.a)



a = Obj2(1); b=Obj2(2); c = Obj2(1)
a == b
False



a == c
True



l = [a, b]
c in l
True



s = set(l)
c in s
False



s
set([<1077128620 2>, <1077128716 1>])



s.add(c)
s
set([<1077128620 2>, <1077128716 1>, <1077128492 1>])



c in s
True








Je n'ai pas Python 2.5 installé ici, si qq'un pouvait confirmer ?



Même résultat avec Python 2.5.1 (r251:54863, May 2 2007, 16:27:44)

Merci pour ces fonctions set et add, je vais quand même lire la doc
avant de les intégrer :o)

Bonne journée

ReM




Avatar
Amaury Forgeot d'Arc
Bonjour,

Existe t il une fonction inverse à la fonction id() ?
Car je souhaite créer un tableau d'id et ensuite, via l'id retrouver mon
objet.
Ex :
i = 1
j = 2

t = [id(i), id(j) ]

for a in t:
var = ????(a)
print var

et le résultat est :
1
2


En fait, la question initiale a quand même une réponse:

import ctypes

i = 1
j = 2

t = [id(i), id(j) ]

for a in t:
... var = ctypes.cast(a, ctypes.py_object).value



... print var
...
1
2

Et voilà!
Mais bon, on n'est pas loin de faire planter le programme à la moindre
erreur. La bonne solution, c'est de faire autrement, comme tout le monde
l'a suggéré.

--
Amaury