(Python) Behandeln Sie ganzzahlige Werte als eine Reihe von Flags

Ich habe eine Python-Klasse implementiert, die ganzzahlige Werte als eine Reihe von Flags behandelt, indem jedes Bit des ganzzahligen Werts als Flag behandelt wird.

Es scheint selten nützlich zu sein.

Implementierung

class IntFlags:
    """Klasse zum Behandeln von Ganzzahlwerten als Satz von Flags"""

    _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)}">'

Wie benutzt man

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")]))

Wenn Sie eine solche Klasse erben und erstellen, können Sie damit wie folgt umgehen.

#Initialisieren
user_permission = UnixPermission(6)
user_permission  #=> <UnixPermission "rw-">
#Greifen Sie auf einzelne Flags zu
user_permission.read  #=> True
#Schreiben Sie einzelne Flags neu
user_permission.execute = True
user_permission  #=> <UnixPermission "rwx">
#Zum ganzzahligen Wert zurückkehren
int(user_permission)  #=> 7

Recommended Posts

(Python) Behandeln Sie ganzzahlige Werte als eine Reihe von Flags
Python Hinweis: Behandeln Sie Listen gemeinsam als Satz
Zeigen Sie ein Histogramm der Bildhelligkeitswerte in Python an
Python --Überprüfen Sie den Wertetyp
Python: Erstellen Sie ein Wörterbuch aus einer Liste von Schlüsseln und Werten
Eine Reihe von Skriptdateien, die Wordcloud mit Python3 ausführen
Verwenden Sie Pymol als Python-Bibliothek
Eine gute Beschreibung der Python-Dekorateure
Format, wenn eine lange Zeichenfolge als Python-Argument übergeben wird
[Python] Ein Memorandum der schönen Suppe4
Eine kurze Zusammenfassung der Python-Sammlung
Ideone> Python-Version: 3.5 (Stand 29. August 2017)
Verwenden Sie Blender als Python-Modul
Behandeln Sie Python-Variablen in der Klasse als private Variablen
Starten Sie das Python-Skript im Dienst
Wenn Sie einen Singleton in Python möchten, stellen Sie sich das Modul als Singleton vor
Versuchen Sie, ein festgelegtes Problem der High-School-Mathematik mit Python zu lösen
Installieren Sie Python als Framework mit pyenv
Zeigen Sie eine Liste der Alphabete in Python 3 an
Erstellen Sie ein Beziehungsdiagramm von Python-Modulen
Verbinde viel Python oder und und
[Python] Sortieren Sie Sammlungstypen als Referenz
[Python] Ruft eine Liste der Instanzvariablen ab
[Python] [Meta] Ist der Python-Typ ein Typ?
Python als stark dynamisch typisierte Sprache
Legen Sie den Prozessnamen des Python-Programms fest
[Python] Verschiedene Kombinationen von Zeichenketten und Werten
Die Geschichte der Verarbeitung A von Blackjack (Python)
[Python] Nur eine Liste der Ordner abrufen
Memorandum zum Löschen von Python-Strings
Python C / C ++ - Erweiterung: Übergeben Sie einen Teil der Daten als np.array an Python (Schritt setzen)
Richten Sie mit Python 3 einen einfachen HTTPS-Server ein
[AtCoder] Lösen Sie ein Problem von ABC101 ~ 169 mit Python
Kombinationsoptimierung - typisches Problem-Set-Split-Problem
Beispiel für die Verwendung von Python> function> * args als Argument
[Python] Erstellen Sie eine Liste mit verschiedenen Zeichentypen
Holen Sie sich den Aufrufer einer Funktion in Python
Ein Memorandum zum Aufrufen von Python aus Common Lisp
Liste der grundlegenden Operationen für Python3-Listen, -Tapples, -Wörterbücher und -Sätze
Kopieren Sie die Liste in Python
Memorandum der Extraktion durch Python BS4-Anfrage
Richten Sie einen Test-SMTP-Server in Python ein.
Löse A ~ D des Yuki-Codierers 247 mit Python
Umschreiben von Elementen in einer Listenschleife (Python)
Schreiben Sie eine Notiz über die Python-Version von Python Virtualenv
Machen Sie mit Python eine Joyplot-ähnliche Handlung von R.
[Python] Ein grobes Verständnis des Protokollierungsmoduls
Ausgabe in Form eines Python-Arrays
Richten Sie einen einfachen SMTP-Server in Python ein
Richten Sie eine Python-Entwicklungsumgebung auf Marvericks ein
Lassen Sie uns einen Teil des maschinellen Lernens mit Python berühren
[Python] Ein grobes Verständnis von Iterablen, Iteratoren und Generatoren
Vorschlag des Kuwahara-Filters als fotografischer Ausdruck
Aufgezeichnete Umgebung für die Datenanalyse mit Python
Berücksichtigung der Stärken und Schwächen von Python
Nehmen Sie eine Instanz einer Python-Ausnahmeklasse nicht direkt als Argument für die Ausnahmeklasse!