什么是re.compile正在做什么和else语句中的fn()做什么? fn在开头用2个参数定义

时间:2016-07-10 01:37:01

标签: python

需要深入了解一下else语句中的re.compile和fn()是什么吗?

     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 个答案:

答案 0 :(得分: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调用它,则d.get()的返回值是一个不同的3参数函数,因此fn(2,3,4)调用fn3b(2,3,4) },返回2 * 3 * 4,即24。

显然,如果我们不知道哪些功能分配给字典d中的哪些键,则无法描述这些行为。调用所需的arity完全取决于指定为dict值的函数的arity