给出以下代码段:
'date_of_birth' => 'nullable|date_format:Y-m-d|before:today',
我想要一个返回'a'的方法a()和一个返回'b'的方法b()。只要我不使用lambda表达式但将属性设置为简单字符串,关联就是正确的。
我认为我的意图很明确?那我错在哪里?
答案 0 :(得分:1)
在Python中,函数将在定义它的作用域中查找非本地名称,或者如果名称在那里不存在则在全局作用域中查找非本地名称。如果与名称关联的值发生更改,则返回的值也会更改。请注意,这不是lambda
函数所特有的。
解决这个问题的方法是通过编写辅助函数来创建闭包。
def fun(ret):
return ret
class A:
def __init__(self):
def apply_fun(item):
return lambda: fun(item)
for string in ['a', 'b']:
setattr(self, string, apply_fun(string))
print(A().a()) # 'a'
在这种特殊情况下,使用__getattr__
可能更适合,因为它旨在动态返回属性。
def fun(ret):
return ret
class A:
def __getattr__(self, item):
if item in ['a', 'b']:
return lambda: fun(item)
print(A().a()) # 'a'