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).
c'est d'ailleurs pour cette raison que certains modules CPython3 ne fonctionnent actuellement pas (multiprocessing , etc...)
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