Comment vérifier si une chaîne est un python valide d'identification? y compris le mot-clé case?
Personne ne sait si il n'y a aucune python méthode qui permet de vérifier si quelque chose est un python nom de la variable, y COMPRIS les contre-vérifier les mots clés réservés? (donc, c'est à dire, quelque chose comme "dans" ou "pour" serait en panne...)
À défaut, quelqu'un sait où je peux obtenir une liste des mots réservés (c'est à dire, dyanamically, à partir de python, plutôt que de le copier-coller quelque chose à partir des documents en ligne)? Ou, ont un autre bon moyen de l'écriture de votre propre contrôle?
Étonnamment, les essais en l'enveloppant d'un setattr en try/except ne fonctionne pas, que quelque chose comme ceci:
setattr(myObj, 'My Sweet Name!', 23)
...fonctionne réellement! (...et peut même être récupéré avec getattr!)
- C'est parce que
setattr
etgetattr
travail juste à l'objet du__dict__
.
Vous devez vous connecter pour publier un commentaire.
La
keyword
module contient la liste de tous les mots clés réservés:Noter que cette liste sera différente selon la version de Python que vous utilisez, comme la liste des mots clés les modifications (en particulier entre Python 2 et Python 3).
Si vous aussi vous voulez tous les builtin noms, utilisez
__builtins__
Et note que certaines de ces (comme
copyright
) ne sont pas vraiment que grand d'une affaire à remplacer.Encore une mise en garde: veuillez noter qu'en Python 2,
True
,False
, etNone
ne sont pas considérés comme des mots-clés. Toutefois, l'affectation deNone
est un SyntaxError. En assignant à laTrue
ouFalse
est autorisé, mais pas recommandé (même avec toutes les autres builtin). En Python 3, ils sont des mots clés, donc ce n'est pas un problème.None
en Python 2. Il n'est pas considéré comme un mot-clé, mais en lui attribuant est un SyntaxError.__future__
les importations sont toujours dans cette liste (par exemple,with
dans Python 2.5).Python 3
Python 3 a maintenant
'foo'.isidentifier()
, de sorte que semble être la meilleure solution pour les dernières versions de Python (merci camarade runciter@freenode pour la suggestion). Toutefois, un peu de manière contre-intuitive, il ne vérifie pas à l'encontre de la liste de mots-clés, de sorte que la combinaison des deux doit être utilisé:Python 2
Pour Python 2, plus facilement possible de vérifier si une chaîne donnée est valide Python identificateur est de laisser Python analyser lui-même.
Il y a deux approches possibles. La plus rapide est d'utiliser
ast
, et de vérifier si l'AST de la même expression est de la forme désirée:Une autre est de laisser
tokenize
module scission de l'identifiant dans le flux de jetons, et vérifier qu'il ne contient que notre nom:La même fonction, mais compatible avec Python 3, ressemble à ceci:
Cependant, être conscient de bugs en Python 3
tokenize
de mise en œuvre qui rejettent certains complètement identificateurs valides comme℘᧚
,ﮯ
et贈ᩭ
.ast
fonctionne très bien cependant. Généralement, je déconseillerais à l'aide detokenize
base de mise en œuvre effective des contrôles.Aussi, certains peuvent considérer que la machinerie lourde comme AST analyseur à être un peu exagéré. Cette simple mise en œuvre est autonome et garanti pour fonctionner sur n'importe quel Python 2:
Voici quelques tests pour vérifier tous ces travaux:
Performance
Toutes les mesures ont été réalisées sur ma machine (MBPr la Mi-2014) sur le même test générés aléatoirement un ensemble de 1 500 000 éléments, 1000 000 valide et 500 000 invalides. YMMV
.isidentifier()
mise en œuvre, carTrue
, ainsi queNone
etFalse
, ne sont pas valides identificateur de noms. Pourriez-vous, veuillez soumettre un rapport de bug?keyword.iskeyword
pour tester réservé identificateurs tels que def, la classe, la Vraie, Aucune Fausse.if
clauses et la finalereturn
dans le Py3 version avec une seule expressionreturn ident.isidentifier() and not keyword.iskeyword(ident)
ast
version la plus. Il fonctionne aussi très bien en Python 3 (donc c'est relativement portable), plus automatiquement, il n'autorise pas les identifiants qui se trouvent être des mots-clés (en supposant que c'est ce que vous voulez, à qui vous n'avez probablement). Ce dernier trait est un peu subtil..ast
approche semble être le meilleur choix pour elle.John: comme une légère amélioration, j'ai ajouté un $ dans le re, sinon, le test ne permet pas de détecter des espaces:
.isidentifier()
.La liste de python mots-clés est à court de sorte que vous pouvez vérifier la syntaxe d'une simple regex et l'adhésion à une relativement petite liste de mots-clés
une plus courte, mais plus dangereux alternative serait
et enfin un peu plus sûr variante
_
dans la deuxième partie ainsi? Aussi, vous avez0-0
au lieu de0-9
.$
à la fin. Sinon, il aura match aussi longtemps qu'il commence avec un identifiant valide.