2017-07-20 4 views
0

Certaines bibliothèques standard Python utilisent des drapeaux comme ceci:création Python de drapeaux, pour l'auto classe créée

re.match(pattern, str, re.MULTILINE | re.IGNORECASE) 

Je me demande, comment mettre en œuvre que si vous créez une classe vous. J'ai cherché l'Internet et a constaté que: Python: passing flags to functions Cette question n'est pas satisfaisant pour moi, car il montre que est l'approche de dire

bla.function(argument, flag1=0, flag3=1) 

Mais je veux vraiment comme

bla.function(argument, bla.SOMEFLAG | bla.SOMEOTHERFLAG) 

est cela est-il possible?

De plus, est-il possible de créer ces drapeaux, sans les laisser faire référence à une valeur réelle ?, donc vous demandez vraiment bla.SOMEFLAG dans le code et non pour un int, qui est représenté par le drapeau? Un exemple d'utilisation de ce serait:

mask_list = [ 
    [    15,   "foo",   "bar"], 
    [bla.TRANSPARENT,   "egg",   14.3], 
    [  (4,7,2), {"name":"john"}, bla.TRANSPARENT] 
] 

où mask_list représente un masque (contenant tous les éléments), qui peut être ensuite comparée à une autre liste en fonction, tous les index où un drapeau de bla.TRANSPARENT est réglé, obtenir ignoré par la comparaison.

Si quelqu'un pouvait me passer un lien vers un fichier, où cela est expliqué, ou pourrait trouver une explication simple, je serais vraiment reconnaissant. (J'utilise Python3)

Merci d'avance!

+0

Vous pourriez il suffit de regarder les fichiers source de la bibliothèque de votre Python. 're.py' par exemple vous montrera exactement comment' re' implémente ses drapeaux. Ce ne sont que des variables globales dans le module. – Duncan

+0

@Duncan C'est une bonne idée, c'est exactement ce que je fais en ce moment, dans ce fichier le drapeau IGNORECASE donne sre_compile.SRE_FLAG_IGNORECASE, j'ai jeté un coup d'oeil à sre_compile.py, SRE_FLAG_IGNORECASE n'est nulle part ailleurs et je peux aussi t comprendre comment le "|" doit être implémenté en regardant ce fichier. – Blarify

+0

Le '|' est juste au niveau du bit ou: les drapeaux sont 1, 2, 4, 8, ... et vous ou eux ensemble pour passer plus d'un. Ils sont actuellement dans 'sre_constants.py' et' sre_compile.py' fait un 'from sre_constants import *' – Duncan

Répondre

0

Il n'y a rien que vous arrêter de faire ceci:

bla.function(argument, bla.SOMEFLAG | bla.SOMEOTHERFLAG) 

si votre signature de la fonction est

def function(arg, flags): 

Mais | est un opérateur de bits et il implique que ses opérandes sont des entiers, ou integer- comme. Et donc bla.SOMEFLAG et bla.SOMEOTHERFLAG doivent être des valeurs entières pour que cela fonctionne.

L'autre option est d'utiliser des paramètres clés:

bla.function(argument, SOMEFLAG = True, SOMEOTHERFLAG = True) 

et définir votre fonction comme ceci:

def function(arg, **flags): 

A l'intérieur de cette fonction, flags sera:

{'SOMEFLAG': True, 'SOMEOTHERFLAG': True} 
+0

Donc, si je crée deux variables à l'intérieur de la classe bla comme SOMEFLAG = 3 et SOMEOTHERFLAG = 7, puis passer bla.function (argument, bla.SOMEFLAG | bla.SOMEOTHERFLAG), il mettrait des drapeaux à un int avec la valeur 10? - C'est bien, avez-vous aussi une approche pour la deuxième partie de ma question, en créant de tels drapeaux, sans valeurs, pour les utiliser en toute sécurité comme des types spéciaux dans les listes? – Blarify

+0

Typiquement pour les drapeaux, vous utilisez des puissances de 2. Si vos drapeaux sont '3' et' 7' alors '3 | 7' sera '7', pas' 10'. '|' est un opérateur 'ou' bitwise. '3 == 0b0011',' 7 == 0b0111', donc si vous 'ou' les bits vous obtenez' 0b0111'. Vous ne pouvez pas avoir d'indicateurs symboliques sans valeurs dans Python. Mais si vous utilisez des arguments de mots-clés, ils arrivent dans votre fonction appelée comme un dictionnaire avec des clés de chaîne et vous pouvez décider après coup ce que vous voulez que les chaînes signifient. – BoarGules