25 avr. 2022

[Dynamo += Python] UnicodeDecodeError

 



Publication d'un petit article resté au fond du tiroir.
Ce type d'erreur apparait sous Dynamo 2.04 (Revit 2019 et moins), même si l'erreur ne devrait plus concerner beaucoup de projets, voici comment la résoudre.

if this article is not in your language, use the Google Translate widget (bottom of page for Mobile version) ⬈

Pour exemple, prenons une liste mélangeant plusieurs types, l'objectif étant de convertir tous les items de la liste en String (texte) avec une capitalisation de type Titre.

  • 1er test avec la méthode .Net ToString().
    On a une erreur, car l'objet 'None' ('null') n'a pas de méthode ToString(). 



  • 2ᵉ test avec la méthode Python str().
    Cette fois-ci on a la fameuse erreur "UnicodeDecodeError"


On pourrait être tenter d'ajouter un header pour spécifier l'encoding à utiliser.
# encoding: utf-8
Mais cela n'est pas effectif, probablement du fait que les scripts Python sous Dynamo sont exécutés depuis un module importé (non principal).

Note:
c'est d'ailleurs pour cette raison que certains modules CPython3 ne fonctionnent actuellement pas (multiprocessing , etc...)


header encoding non fonctionnel



test si le script est exécuté depuis le module principal



Une solution simple consiste à utiliser le constructeur unicode() pour convertir le String en Unicode. Celui-ci est automatiquement converti en objet .Net System.String par IronPython.






Résultat

À noter que pour les versions ultérieures de IronPython 2.7.8+ (Dynamo 2.3+) le problème ne se pose plus.




import sys

lstval = IN[0]
error = "No Error"
try:
	test_conversionA = [str(val).title() for val in lstval]
except Exception as ex:
	error = repr(ex)
	test_conversionA = [unicode(val).title() for val in lstval]
OUT = sys.version, error, test_conversionA
_
Pour information, sous Python 2 le type str et unicode héritent du type basestring.


   object 
     | 
     | 
  basestring 
    / \ 
   /   \ 
 str unicode

0 commentaires:

Enregistrer un commentaire