在Python中延迟初始化的字符串

2024-05-17 05:29:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我发现从str派生并重写{}可以覆盖字符串。你知道有什么魔法可以创建一个延迟初始化的字符串吗? 因此

def f(a, b):
    print("f called")
    return a+b

s=f("a", "b")
print("Starting")
print(s)

我如何向函数f添加一个decorator,使这个函数只在打印“Starting”之后执行(基本上是在第一次访问时)?似乎很棘手。。。:)

我可以在返回对象时这样做,因为在那里我拦截属性访问。但是,字符串不使用属性访问?在


Tags: 对象函数字符串return属性def魔法decorator
3条回答

尝试使用来自stringlikeLazyString类,如下所示

from stringlike.lazy import LazyString

def f(a, b):
    print("f called")
    return a+b

s = LazyString(lambda: f("a", "b"))
print("Starting")
print(s)

做你想做的事也许有更简单的方法 然而,我曾经为泛型函数编写了一个泛型的“lazy decorator”,它完全可以满足您的要求,因为它几乎适用于函数返回的任何类型的对象。在

基本思想是:对于给定的退出对象,Python实际上并不“使用”其值,而是调用对象类中的“dunder”(magic double“uuu”)方法之一- 它可以用来表示它(调用__repr__ __str__ __unicode__),从中获取属性,进行调用,在算术运算中使用它作为运算符等等。在

因此,这个decorator在函数被调用时,基本上存储参数并等待调用这些神奇的方法中的任何一个,然后它进行originall调用并缓存返回值-

soruce代码在这里:

https://bitbucket.org/jsbueno/metapython/src/f48d6bd388fd/lazy_decorator.py

您要查找的属性是__str__()__repr__()和{}。在

相关问题 更多 >