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
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
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.
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
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
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
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
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
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 ?
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
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
(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
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
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
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
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é.
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é.