2016-07-10 4 views
-5

else文でre.compileとfn()が何をしているかについてのいくつかの洞察が必要ですか?re.compileとは何ですか?また、else文のfn()は何ですか? fnは最初に2つの引数で定義されています

 def extract_bc(lines): #function name 
     xy_series = re.compile(r"XY1|XY2|XY3") #what is this doing? 
     card_index = _card_index(lines) 
     bc = [] 
     for line in lines: 
      card, value = _parse_card(line) 
      fn = transform.get(card, False) 

      if fn is False: 
       bc.append(line) 
      elif fn is None: 
       continue 
      elif isinstance(fn, str): 
       bc.append(line.replace(card, fn)) 
      else: 
       bc.append(fn(card, value, card_index)) #what is this doing? 
+1

'xy_series'は2回目で言及されていないので、regexコンパイラを使用して文字列を正規表現に変換するのに時間と労力を無駄にしています。 –

+0

'fn = transform.get(card、False)'はこのスコープであなたの 'fn'を定義しています。 'transform.get()'が返すものは、ここにある証拠にない内容に依存します。 –

+0

私はfn =が何をしているのかを見ていますが、else文ではfn(card、value、card_index)何をしていますか? – millerlyte79

答えて

1

ここで、あなたのコードがどのように機能するかを紹介する例ですと、なぜ私たちは、キーを知らなくても、そのメカニズムを記述することはできません。

# define a 3-argument function 
def fn3add(a,b,c): return a+b+c 

# define a second 3-argument function that behaves differently 
def fn3mult(a,b,c): return a*b*c 

# define a 2-argument function 
def fn2add(a,b): return a+b 

def doSomething(k): 
    # define a dictionary *where the functions are the values* 
    d = { 
     '3a': fn3add, 
     '2a': fn2add, 
     '3m': fn3mult, 
    } 
    # retrieve a value according to our argument 
    fn = d.get(k, False) # after this is run, "fn" is fn2add, fn3add, fn3mult, or False 
    # handle the False case 
    if fn == False: 
     return None 
    # call the function with 3 arguments (for the sake of demonstration) 
    return fn(2,3,4) 

doSomething('3a') # runs fn3add, returns 2+3+4=9 
doSomething('3m') # runs fn3mult, returns 2*3*4=24 
doSomething('2a') # tries to run fn2, throws an exception 
doSomething('hi') # get() returns False, so function returns None 

、これは'3a'で呼び出された場合、その後、 d.get()の戻り値は3引数の関数なのでfn(2,3,4)fn3a(2,3,4)の呼び出しで、2 + 3 + 4、つまり9を返します。

それは3mと呼ばれていた場合、Rの手は、d.get()の戻り値が異なる3引数の関数であるので、fn(2,3,4)は、それは不可能だろう、24

明らかである2 * 3 * 4を返しfn3b(2,3,4)を呼び出しますどの機能が辞書内のどのキーに割り当てられているかわからない場合、これらの動作を記述する。d;呼び出しに必要なアリティは、命令としてに値として割り当てられた関数のアリティに完全に依存します。

+0

私の質問への答えはfnです別の関数である辞書のキーを呼び出しているので。なぜ英語で言うのが難しいのですか? – millerlyte79

+0

しかし、**は辞書内のキーを呼び出すものではありません。キーは文字列であり、呼び出し可能ではありません。 ** value **として辞書に格納されている関数を呼び出しています。この答えを書く前に、私はあなたに何度も英語で話しました。 –

+1

... re:「英語で言うのはなぜそんなに難しいのですか?」私は、自分自身を認めずに、あなたが(まだ)他の場所で不具合を探していることに少し驚いています。結局のところ、自分自身に欠陥が見つかった場合、それはあなたが持っている経験を改善するためにあなたが個人的に権限を与えられたものです。見つかった障害が他の障害にしかない場合、サイトとのやりとりの経験を向上させるオプションはありません。 –

関連する問題