考虑以下:
@property
def name(self):
if not hasattr(self, '_name'):
# expensive calculation
self._name = 1 + 1
return self._name
Run Code Online (Sandbox Code Playgroud)
我是新手,但我认为缓存可能会被装入装饰器中.只有我找不到喜欢它的人;)
PS真正的计算不依赖于可变值
例如,如果我有以下声明:
if( foo1 or foo2)
...
...
Run Code Online (Sandbox Code Playgroud)
如果foo1为true,python会检查foo2的条件吗?
我正在尝试定义一个对象,master其属性/方法decide可以用表达式调用ex,但对该表达式的评估被推迟,直到某些逻辑decide要求它(它甚至可能不这样做)。所以,在这样的代码中:
master.decide(ex)
Run Code Online (Sandbox Code Playgroud)
ex如果逻辑decide如此说明,则应该可以保持未评估状态。在代码中,ex代表“我的图书馆客户提供的任意表达式”。它可以是简单的1 + 2(在这里我不会真的在乎懒惰评估)为复杂的do_http_request().delete_record_from_database()(这里我当然做护理)。
这样的事情可能吗?我在语法方面很灵活,因此如果存在必须涉及额外运算符等的解决方案 ex,我可以考虑。但我想ex保持一种表达方式。
我正在考虑(ab)使用像andand这样的短路运算符or,但似乎没有办法让它们返回布尔值以外的其他东西。
我能想到的最好的方法是ex用 lambda包装:
master.decide(lambda: ex)
def decide(ex):
if decide_to_do_it():
result = ex()
somehow_use(result)
Run Code Online (Sandbox Code Playgroud)
或者将其作为字符串传递并使用eval:
master.decide('ex')
def decide(ex):
if decide_to_do_it():
result = eval(ex)
somehow_use(result)
Run Code Online (Sandbox Code Playgroud)
(是的,这个会有范围界定问题)。
也许有什么神奇的功能、技巧或其他什么东西可以让我保持ex简单的表达方式?