Question

Comment puis-je automatiser un test pour appliquer qu'un corps de code Python 2.x ne contient pas d'instances de chaîne (uniquement instances unicode)?

Par exemple.

Puis-je le faire à partir du code?

Yat-il un outil d'analyse statique qui a cette fonction?

Modifier

Je voulais ce pour une application en Python 2.5, mais il se trouve ce n'est pas vraiment possible parce que:

  1. 2.5 ne supporte pas unicode_literals
  2. kwargs les clés de dictionnaire ne peuvent pas être des objets unicode, uniquement les chaînes

Je suis d'accepter la réponse qui dit qu'il est impossible, même si elle est pour des raisons différentes:)

Était-ce utile?

La solution

Vous ne pouvez pas appliquer cette tous Les chaînes sont Unicode; même avec from __future__ import unicode_literals dans un module, des chaînes d'octets peuvent être écrits comme b'...', comme ils peuvent en Python 3.

n'a une option qui pourrait être utilisé pour obtenir le même effet que unicode_literals globalement: l'option de ligne de commande -U. Cependant, il a été abandonné au début de la série 2.x parce qu'il est fondamentalement cassé chaque script.

Quel est votre objectif pour cela? Il est pas souhaitable de supprimer les chaînes d'octets. Ils ne sont pas « mauvais » et les chaînes Unicode ne sont pas universellement « mieux »; ils sont deux animaux différents et vous aurez besoin des deux. Les chaînes d'octets seront certainement nécessaires pour parler des fichiers binaires et des services de réseau.

Si vous voulez être prêt à la transition vers Python 3, la meilleure tactique est d'écrire b'...' pour toutes les chaînes que vous avez vraiment l'intention d'être octets, et u'...' pour les chaînes qui sont intrinsèquement Unicode. La chaîne de format par défaut '...' peut être utilisé pour tout le reste, les endroits où vous ne se soucient pas et / ou si Python 3 modifie le type de chaîne par défaut.

Autres conseils

Il me semble que vous avez vraiment besoin d'analyser le code avec un honnête analyseur python bonté. Ensuite, vous aurez besoin de creuser à travers l'AST votre analyseur produit pour voir si elle contient des chaînes littérales.

On dirait que Python est livré avec un analyseur out de la boîte. A partir de cette Je suis cet exemple de code de travail:

import parser
from token import tok_name

def checkForNonUnicode(codeString):
    return checkForNonUnicodeHelper(parser.suite(codeString).tolist())

def checkForNonUnicodeHelper(lst):
    returnValue = True
    nodeType = lst[0]
    if nodeType in tok_name and tok_name[nodeType] == 'STRING':
        stringValue = lst[1]
        if stringValue[0] != "u": # Kind of hacky. Does this always work?
            print "%s is not unicode!" % stringValue
            returnValue = False

    else:
        for subNode in [lst[n] for n in range(1, len(lst))]:
            if isinstance(subNode, list):
                returnValue = returnValue and checkForNonUnicodeHelper(subNode)

    return returnValue

print checkForNonUnicode("""
def foo():
    a = 'This should blow up!'
""")
print checkForNonUnicode("""
def bar():
    b = u'although this is ok.'
""")

qui affiche

'This should blow up!' is not unicode!
False
True

chaînes de doc ne sont pas unicode, mais devraient être autorisés, de sorte que vous pourriez avoir à faire quelque chose de plus compliqué comme from symbol import sym_name où vous pouvez rechercher quels types de noeuds sont les définitions de classe et de fonction. Ensuite, le premier sous-noeud qui est simplement une chaîne, à savoir ne fait pas partie d'une cession ou autre, devrait être autorisé à ne pas être unicode.

Bonne question!

Modifier

Juste un suivi commentaire. Idéalement à vos besoins, parser.suite n'évalue pas réellement votre code python. Cela signifie que vous pouvez exécuter cet analyseur de vos fichiers Python sans se soucier des erreurs d'attribution de noms ou d'importation. Par exemple, disons que vous avez myObscureUtilityFile.py qui contient

from ..obscure.relative.path import whatever

Vous pouvez

checkForNonUnicode(open('/whoah/softlink/myObscureUtilityFile.py').read())

SD code source moteur de recherche (SCSE) peut fournir directement ce résultat.

Le SCSE fournit un moyen de rechercher très rapidement à travers de grands ensembles de fichiers en utilisant une partie de la structure de la langue pour permettre des requêtes précises et minimiser les faux positifs. Il gère un large éventail des langues, même en même temps, y compris Python. Une interface graphique montre de résultats et une page de texte réel du fichier contenant un coup sélectionné.

Il utilise des informations lexicales des langues source comme base pour les requêtes, composés de mots-clés différents langauge et motif jetons qui correspondent à différents éléments langauge contenu. SCSE connaît les types de lexèmes disponibles dans le langauge. On peut rechercher un identifiant générique (en utilisant la requête jeton I) ou un identifiant correspondant à une expression de regulatr. Similaire, sur peut rechercher une chaîne générique (en utilisant la requête jeton « S » pour « tout type de littéral chaîne ») ou pour un particulier type de chaîne (pour Python y compris "UnicodeStrings", les chaînes non-unicode, etc., qui regroupent l'ensemble des choses Python comprenant "S").

Ainsi, une recherche:

 'for' ... I=ij*

trouve le mot-clé « pour » près ( « ... ») un identifiant dont le préfixe est « ij » et vous montre tous les coups. (Spécifique à la langue des espaces, y compris les pauses et les commentaires ligne sont ignorés.

Une recherche triviale:

  S

trouve toutes les chaînes littérales. Cela est souvent un ensemble assez grand: -}

Une recherche

 UnicodeStrings

trouve toutes les chaînes littérales qui sont définis comme lexicalement Unicode Strings (u "...")

Qu'est-ce que vous voulez sont toutes les chaînes qui ne sont pas UnicodeStrings. Le SCSE fournit un « soustraire » opérateur qui Soustrait coups d'un genre que hits d'une autre de recouvrement. Donc, votre question, « ce que les chaînes ne sont pas unicode » est exprimé de façon concise comme:

  S-UnicodeStrings

Tous les coups seront affichés les chaînes qui ne sont pas des chaînes unicode, votre question précise.

Le SCSE fournit des installations journalisation afin que vous puissiez enregistrer hits. Vous pouvez exécuter SCSE à partir d'une ligne de commande, ce qui permet une requête scriptée pour votre réponse. Mettre cela en un script de commande fournirait un outil donne votre réponse directement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top