相关疑难解决方法(0)

是否有一个装饰器来简单地缓存函数返回值?

考虑以下:

@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真正的计算不依赖于可变值

python caching decorator

133
推荐指数
11
解决办法
9万
查看次数

Python是否懒惰地评估条件是否存在?

例如,如果我有以下声明:

if( foo1 or foo2)
    ...
    ...
Run Code Online (Sandbox Code Playgroud)

如果foo1为true,python会检查foo2的条件吗?

python lazy-evaluation

60
推荐指数
4
解决办法
3万
查看次数

我可以导致对表达式的延迟评估吗?

我正在尝试定义一个对象,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简单的表达方式?

python lazy-evaluation

6
推荐指数
1
解决办法
1716
查看次数

标签 统计

python ×3

lazy-evaluation ×2

caching ×1

decorator ×1