Questa è una vecchia questione, ormai, ma mi piacerebbe per aggiungere una risposta su come farlo in Python 3 dato che ho realizzato un'implementazione.
I caratteri consentiti sono documentati qui: https://docs.python.org/3/reference/lexical_analysis.html#identifiers. Includono molti personaggi speciali, tra cui la punteggiatura, il carattere di sottolineatura e un'intera serie di personaggi stranieri. Fortunatamente il modulo unicodedata
può essere d'aiuto. Ecco la mia implementazione attuazione direttamente quello che dice la documentazione Python:
import unicodedata
def is_valid_name(name):
if not _is_id_start(name[0]):
return False
for character in name[1:]:
if not _is_id_continue(character):
return False
return True #All characters are allowed.
_allowed_id_continue_categories = {"Ll", "Lm", "Lo", "Lt", "Lu", "Mc", "Mn", "Nd", "Nl", "Pc"}
_allowed_id_continue_characters = {"_", "\u00B7", "\u0387", "\u1369", "\u136A", "\u136B", "\u136C", "\u136D", "\u136E", "\u136F", "\u1370", "\u1371", "\u19DA", "\u2118", "\u212E", "\u309B", "\u309C"}
_allowed_id_start_categories = {"Ll", "Lm", "Lo", "Lt", "Lu", "Nl"}
_allowed_id_start_characters = {"_", "\u2118", "\u212E", "\u309B", "\u309C"}
def _is_id_start(character):
return unicodedata.category(character) in _allowed_id_start_categories or character in _allowed_id_start_categories or unicodedata.category(unicodedata.normalize("NFKC", character)) in _allowed_id_start_categories or unicodedata.normalize("NFKC", character) in _allowed_id_start_characters
def _is_id_continue(character):
return unicodedata.category(character) in _allowed_id_continue_categories or character in _allowed_id_continue_characters or unicodedata.category(unicodedata.normalize("NFKC", character)) in _allowed_id_continue_categories or unicodedata.normalize("NFKC", character) in _allowed_id_continue_characters
Questo codice è adattato da qui sotto CC0: https://github.com/Ghostkeeper/Luna/blob/d69624cd0dd5648aec2139054fae4d45b634da7e/plugins/data/enumerated/enumerated_type.py#L91. È stato ben testato
E il motivo del voto negativo è ...? Questa è una domanda fondamentale, ma comunque valida: +1. – EOL
Cosa fa cercando di creare una classe con il nome 'None' o' __debug__'? Secondo i seguenti documenti, mi aspetto che sollevare un 'SyntaxError': https://docs.python.org/2/library/constants.html – ArtOfWarfare