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

Code Python2.x vers Python3.x

13 réponses
Avatar
Nicolas
Bonjour,

Soit, le code suivant :
self.records = [r for r in self.records if r[self.key]<other]

Avec Python2.x, si self.key et other sont de type différents, la
comparaison retourne True ou False en fonction des types.
Avec Python3.x, ce n'est pas permis. Une exception est retournée.

Mon code modifié pour Python 3.x est :
rec = []
for r in self.records :
try :
if r[self.key]<other :
rec.append(r)
except TypeError :
pass
self.records = rec

Y a t-il une écriture plus concise possible ?

Nicolas

3 réponses

1 2
Avatar
jmfauth
On 17 oct, 09:01, Nicolas wrote:
Le 14/10/2011 11:29, jmfauth a écrit :

> On 14 oct, 09:00, Nicolas  wrote:

>> L'utilisation de "isinstance()" est possible mais rendrait le code
>> inutilement compliqué.

> Pourquoi? C'est fait pour cela. Il me semble que la première
> chose à faire avant de comparer est de trier ce qui est comparable.
> Peu importe le type de donnée.

>>>> z = ['a', 1.0, 3, {}, set(), 99, None]
>>>> a = [e for e in z if isinstance(e, (int, float))]
>>>> a
> [1.0, 3, 99]
>>>> other = 5
>>>> [e for e in a if e<  other]
> [1.0, 3]

> jmf

Comme je l'ai dit à Alain :
Ce que je veux, c'est que le code traduit en Python3 fonctionne
exactement comme le code d'origine écrit en Python2. Pour question de
compatibilité.

Nicolas





Le code proposé n'est qu'illustratif et fonctionne aussi bien en
Python 2 qu'en Python 3.

Avis tout personnel. Quand on en arrive à devoir trier
une liste d'objects non comparables, il y a quelque part
quelque chose qui ne joue pas.

Le "grand nettoyage" de Python 3 ne fait que le confirmer.

2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)]
'a' < 5






False
None < 5






True


sys.version






'3.2.2 (default, Sep 4 2011, 09:51:08) [MSC v.1500 32 bit (Intel)]'
'a' < 5






Traceback (most recent call last):
File "<eta last command>", line 1, in <module>
TypeError: unorderable types: str() < int()
None < 5






Traceback (most recent call last):
File "<eta last command>", line 1, in <module>
TypeError: unorderable types: NoneType() < int()









Bon suite.
jmf
Avatar
jmfauth
On 17 oct, 10:57, jmfauth wrote:
On 17 oct, 09:01, Nicolas wrote:



> Le 14/10/2011 11:29, jmfauth a écrit :

> > On 14 oct, 09:00, Nicolas  wrote:

> >> L'utilisation de "isinstance()" est possible mais rendrait le code
> >> inutilement compliqué.

> > Pourquoi? C'est fait pour cela. Il me semble que la première
> > chose à faire avant de comparer est de trier ce qui est comparable.
> > Peu importe le type de donnée.

> >>>> z = ['a', 1.0, 3, {}, set(), 99, None]
> >>>> a = [e for e in z if isinstance(e, (int, float))]
> >>>> a
> > [1.0, 3, 99]
> >>>> other = 5
> >>>> [e for e in a if e<  other]
> > [1.0, 3]

> > jmf

> Comme je l'ai dit à Alain :
> Ce que je veux, c'est que le code traduit en Python3 fonctionne
> exactement comme le code d'origine écrit en Python2. Pour question de
> compatibilité.

> Nicolas

Le code proposé n'est qu'illustratif et fonctionne aussi bien en
Python 2 qu'en Python 3.

Avis tout personnel. Quand on en arrive à devoir trier
une liste d'objects non comparables, il y a quelque part
quelque chose qui ne joue pas.

Le "grand nettoyage" de Python 3 ne fait que le confirmer.

2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)]>>> 'a' < 5
False
>>> None < 5

True

>>> sys.version

'3.2.2 (default, Sep  4 2011, 09:51:08) [MSC v.1500 32 bit (Intel)]'>>> 'a' < 5

Traceback (most recent call last):
  File "<eta last command>", line 1, in <module>
TypeError: unorderable types: str() < int()>>> None < 5

Traceback (most recent call last):
  File "<eta last command>", line 1, in <module>
TypeError: unorderable types: NoneType() < int()



Bon suite.
jmf




Errata. Lire Bonne suite.
Avatar
Nicolas
Le 17/10/2011 10:57, jmfauth a écrit :
On 17 oct, 09:01, Nicolas wrote:
Le 14/10/2011 11:29, jmfauth a écrit :

On 14 oct, 09:00, Nicolas wrote:



L'utilisation de "isinstance()" est possible mais rendrait le code
inutilement compliqué.





Pourquoi? C'est fait pour cela. Il me semble que la première
chose à faire avant de comparer est de trier ce qui est comparable.
Peu importe le type de donnée.



z = ['a', 1.0, 3, {}, set(), 99, None]
a = [e for e in z if isinstance(e, (int, float))]
a






[1.0, 3, 99]
other = 5
[e for e in a if e< other]






[1.0, 3]



jmf



Comme je l'ai dit à Alain :
Ce que je veux, c'est que le code traduit en Python3 fonctionne
exactement comme le code d'origine écrit en Python2. Pour question de
compatibilité.

Nicolas





Le code proposé n'est qu'illustratif et fonctionne aussi bien en
Python 2 qu'en Python 3.

Avis tout personnel. Quand on en arrive à devoir trier
une liste d'objects non comparables, il y a quelque part
quelque chose qui ne joue pas.

Le "grand nettoyage" de Python 3 ne fait que le confirmer.



Je suis tout à fait d'accord.
Mais, ici, il s'agit de porter une bibliothèque écrite en Python2 vers
du Python3 tout en gardant un fonctionnement strictement identique. Ceci
pour que les applications déjà existantes (et également portées vers
Python3 bien sûr) ne voient pas leur fonctionnement changer.
S'il en était autrement, ce n'est pas une traduction des applications
qu'il faudrait faire mais une réécriture.

Nicolas

2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)]
'a'< 5






False
None< 5






True


sys.version






'3.2.2 (default, Sep 4 2011, 09:51:08) [MSC v.1500 32 bit (Intel)]'
'a'< 5






Traceback (most recent call last):
File "<eta last command>", line 1, in<module>
TypeError: unorderable types: str()< int()
None< 5






Traceback (most recent call last):
File "<eta last command>", line 1, in<module>
TypeError: unorderable types: NoneType()< int()









Bon suite.
jmf
1 2