2016-06-25 1 views
1

Je passe avec une base de code qui utilise la méthode smart_str de Django:Existe-t-il un moyen de remplacer smart_str de Django par une solution native Python?

for p in pro: 
     print smart_str(p["title"]) 

Je veux le remplacer par une solution de python natif sans impliquer django à l'intérieur mais je ne suis pas sûr de ce que smart_str faire exactement:

smart_str(s, encoding='utf-8', strings_only=False, errors='strict')

Alias ​​de smart_bytes() sur Python 2 et smart_text() sur python 3. Cette fonction retourne un str ou une chaîne paresseux.

et

smart_bytes(s, encoding='utf-8', strings_only=False,errors='strict')

Retourne la version de bytestring s, codé tel que spécifié dans l'encodage.

Si strings_only a pour valeur True, ne convertissez pas (certains) des objets qui ne sont pas de type chaîne. Pourrions-nous le remplacer simplement par print unicode(u'\xa1').encode("utf-8")?

+0

Il est * « Python natif » *, voir [le code source ] (https://github.com/django/django/blob/92053acbb9160862c3e743a99ed8ccff8d4f8fd6/django/utils/encoding.py). Il gère beaucoup plus de cas que votre alternative suggérée. – jonrsharpe

+0

Je vois, donc je viens de copier le code des fonctions 'smart_byte' et' force_byte' pour être indépendant de django –

+0

Aussi vous aurez besoin de mettre en œuvre (ou au moins fournir un mannequin pour) 'django.utils.functional.Promise' pour les utiliser tels quels. – jonrsharpe

Répondre

3

Je l'ai remplacé avec cette fonction factice qui applique unicode(x).encode("utf-8") si la chaîne est unicode, et le convertir en str si elle est un numéro:

def smart_str(x): 
    if isinstance(x, unicode): 
     return unicode(x).encode("utf-8") 
    elif isinstance(x, int) or isinstance(x, float): 
     return str(x) 
    return x 
+0

ok, mais 'smart_str' en fait beaucoup plus que ça ... – Renaud

+1

Je sais, c'est tout ce qu'il fallait pour ce projet –