2017-07-20 5 views
0

のためにいくつかのPythonの標準ライブラリは、このようなフラグを使用します。Pythonの作成、自己作成したクラス

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

を使用すると、クラスを自分で作成している場合、私は、それを実装する方法を、疑問に思って。 私はインターネットを検索していることを発見した:それは唯一のショー

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

を言うのアプローチだ。しかし、私は本当に

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

のようにそれをしたいですとその質問は、私のために満足していない Python: passing flags to functions これは可能ですか?

また、これらのフラグを実際の値を参照させずに作成することができます。したがって、フラグで表されるintではなくbla.SOMEFLAGをコード内で実際に求めますか?そのための使用例は次のようになります

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

mask_list、後で関数によって別のリストと比較することができる(任意の要素を含む)は、マスクを表し、bla.TRANSPARENTフラグが設定されているすべてのインデックスは、取得します比較によって無視される。

誰かが私にファイルへのリンクを渡すことができた場合、これが説明されているか、または簡単な説明が出てくる可能性があります。本当に感謝します。 (私はPython3を使用しています)

ありがとうございました!

+0

あなたができましたあなたのPythonのライブラリソースファイルを見てください。たとえば 're.py'は、' re'がフラグをどのように実装しているかを正確に示します。それらはモジュール内のグローバル変数です。 – Duncan

+0

@Duncanこれは良いアイデアです。これはまさに私が今行っていることです。このファイルでIGNORECASEフラグがsre_compile.SRE_FLAG_IGNORECASEになりました。sre_compile.pyを見ました.SRE_FLAG_IGNORECASEはそこに設定されていません。また、どのように "|"このファイルを見て実装する必要があります。 – Blarify

+0

'|'はちょうどビットであるか、またはフラグは1,2,4,8、...そして1つ以上のものを渡します。実際には 'sre_constants.py'と' sre_compile 'にあります。py'は 'from sre_constants import *'を実行します。 – Duncan

答えて

0

ありますが、これをやって停止し、何もされています

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

あなたの関数のシグネチャが

def function(arg, flags): 

しかし|ある場合はビット演算子ではありませんので、それはそのオペランドが整数であることを意味し、またはinteger-好き。したがって、bla.SOMEFLAGbla.SOMEOTHERFLAGは整数値でなければなりません。

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

と、このようにあなたの関数を定義します:

他のオプションは、キーワードパラメータを使用することで、その関数内

def function(arg, **flags): 

flagsは次のようになります。

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

SOMEFLAG = 3とSOMEOTHERFLAG = 7のようにクラスbla内に2つの変数を作成し、bla.function(引数、bla.SOMEFLAG | bla.SOMEOTHERFLAG)を渡すとフラグを設定します値10のintに? - いいですね、私の質問の2番目の部分についてのアプローチもあります。値を持たないフラグを作成して、リスト内の特別な型として安全に使用しますか? – Blarify

+0

通常、フラグの場合、2の累乗を使います。フラグが '3'と' 7'なら '3 | 「7」は「10」ではなく「7」となる。 '|'はビット演算子 'or'です。 '3 == 0b0011'、' 7 == 0b0111'なので、ビットを 'または'にすると '0b0111'が得られます。 Pythonでは値を持たないシンボリック・フラッグを持つことはできません。しかし、あなたがキーワード引数を使うと、それらは、文字列キーを持つ辞書としてあなたの呼び出された関数に到着します。そして、あなたは文字列が意味するものを事実の後で決めることができます。 – BoarGules

関連する問題