(Python) Traite les valeurs entières comme un ensemble d'indicateurs

J'ai implémenté une classe Python qui traite les valeurs entières comme un ensemble d'indicateurs en traitant chaque bit de la valeur entière comme un indicateur.

Cela semble rarement utile.

la mise en oeuvre

class IntFlags:
    """Classe pour traiter les valeurs entières comme un ensemble d'indicateurs"""

    _alias = []

    def __init__(self, state: int = 0):
        if state < 0:
            raise ValueError
        object.__setattr__(self, "_state", state)

    def __getitem__(self, digit: int) -> bool:
        return (self._state & (1 << digit)) > 0

    def __setitem__(self, digit: int, value: bool):
        if type(value) is not bool:
            raise TypeError
        if self[digit] != value:
            object.__setattr__(self, "_state", self._state ^ (1 << digit))

    def __getattr__(self, key: str) -> bool:
        alias = type(self)._alias
        if key not in alias:
            raise AttributeError
        return self[alias.index(key)]

    def __setattr__(self, key: str, value: bool):
        alias = type(self)._alias
        if key not in alias:
            raise AttributeError
        self[alias.index(key)] = value

    def __int__(self) -> int:
        return self._state

    def __str__(self) -> str:
        return f"{self._state:0{len(type(self)._alias)}b}"
    
    def __repr__(self) -> str:
        return f'<{type(self).__name__} "{str(self)}">'

Comment utiliser

class UnixPermission(IntFlags):
    _alias = ["execute", "write", "read"]
    
    def __str__(self) -> str:
        return "".join(reversed([char if self[idx] else "-" for idx, char in enumerate("xwr")]))

Si vous héritez et créez une telle classe, vous pouvez la gérer comme suit.

#Initialiser
user_permission = UnixPermission(6)
user_permission  #=> <UnixPermission "rw-">
#Accéder aux drapeaux individuels
user_permission.read  #=> True
#Réécrire des drapeaux individuels
user_permission.execute = True
user_permission  #=> <UnixPermission "rwx">
#Revenir à la valeur entière
int(user_permission)  #=> 7

Recommended Posts

(Python) Traite les valeurs entières comme un ensemble d'indicateurs
python Remarque: Traitez les listes collectivement comme un ensemble
Afficher un histogramme des valeurs de luminosité de l'image en python
Python - Vérifiez le type de valeurs
Python: créer un dictionnaire à partir d'une liste de clés et de valeurs
Un ensemble de fichiers de script qui font wordcloud avec Python3
Utilisez pymol comme bibliothèque python
Une bonne description des décorateurs Python
Format lors du passage d'une longue chaîne comme argument de python
[Python] Un mémorandum de belle soupe4
Un bref résumé de la collection Python
Version Ideone> Python: 3.5 (au 29 août 2017)
Utilisez Blender comme module Python
Traitez les variables de classe Python comme des variables privées
Lancer le script Python en service
Si vous voulez un singleton en python, considérez le module comme un singleton
Essayez de résoudre un problème défini de mathématiques au lycée avec Python
Installer Python en tant que Framework avec pyenv
Afficher une liste d'alphabets en Python 3
Créer un diagramme de relations des modules Python
Connectez beaucoup de Python ou et et
[Python] Trier les types de collection comme référence
[python] Obtenir une liste de variables d'instance
[python] [meta] Le type de python est-il un type?
Python en tant que langage fortement typé dynamiquement
Définissez le nom du processus du programme Python
[Python] Diverses combinaisons de chaînes de caractères et de valeurs
L'histoire du traitement A du blackjack (python)
[Python] Obtenir une liste de dossiers uniquement
Mémorandum du processus de suppression de chaîne python
Extension Python C / C ++: transmettre une partie des données à Python en tant que np.array (set stride)
Configurer un serveur HTTPS simple avec Python 3
[AtCoder] Résoudre un problème de ABC101 ~ 169 avec Python
Problème de fractionnement typique de la combinaison de problèmes
Exemple de prise de Python> function> * args comme argument
[python] Créer une liste de différents types de caractères
Récupérer l'appelant d'une fonction en Python
Un mémorandum sur l'appel de Python à partir de Common Lisp
Liste des opérations de base de Python3 list, tapple, dictionnaire, set
Copiez la liste en Python
Mémorandum d'extraction par requête python bs4
Configurez un serveur SMTP de test en Python.
Résolvez A ~ D du codeur yuki 247 avec python
Réécrire des éléments dans une boucle de listes (Python)
Écrire une note sur la version python de python virtualenv
Créez un tracé de R semblable à un joyplot avec python
[Python] Une compréhension approximative du module de journalisation
Sortie sous la forme d'un tableau python
Configurer un serveur SMTP simple en Python
Configurer un environnement de développement Python sur Marvericks
Touchons une partie de l'apprentissage automatique avec Python
[Python] Une compréhension approximative des itérables, des itérateurs et des générateurs
Proposition du filtre Kuwahara comme expression photographique
Environnement enregistré pour l'analyse des données avec Python
Prise en compte des forces et faiblesses de Python
Ne prenez pas une instance d'une classe d'exception Python directement comme argument de la classe d'exception!