擅长:python、mysql、java
<p>你有一些其他的评论和答案来解释发生了什么,还有你的
“有趣”的问题是它迫使读者困惑的感觉
代码和各种绑定问题</p>
<p>但是,如果我在审查期间从同事那里看到您的代码,我会要求
重写–不是因为我马上就知道有bug,而是因为它
需要对绑定是否来自周围环境进行过多的从头计算
(和不断变化的)作用域将完全按照所希望的那样运行</p>
<p>相反,在你的项目中坚持更严格的纪律,从而减轻压力
读者的认知负荷(大部分时间是<em>你</em>)。具体来说,移动
函数创建到一个真正隔离的范围,并传递所有不同的
该函数创建者的输入。这种方法是可靠的,因为它要么
第一次尝试就要努力,否则就会完全失败(如果你忽略了通过所有的测试)
函数创建者所需的参数)</p>
<p>一种方法是:</p>
<pre><code># A function to create another function, with non-surprising argument binding.
# We expect nothing from the surrounding scope. All business can be done locally.
def get_func(label, x):
return lambda prefix: print(f'''{prefix} => {label}: {x}''')
# Some input data.
specification = {
label : [label + str(n) for n in range(3)]
for label in ('A', 'B', 'C')
}
# Use that data to create some functions.
funcs = [
get_func(label, x)
for label, xs in specification.items()
for x in xs
]
# Run 'em.
for f in funcs:
f('Show')
</code></pre>