需要深入了解一下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?
答案 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 。