由于缺乏更好的词,我选择了这个标题。
我想要的是能够做这样的事情:
>>> from random import randint
>>> fruits = [
... "Orange",
... "Banana",
... f"{randint(2,5)} Cherries",
... ]
>>> fruits[2]
'3 Cherries'
>>> fruits[2]
'5 Cherries'
>>> fruits[2]
'2 Cherries'
但是,字符串中的文字表达式在创建列表时会被计算一次,并且每次访问它时都会给出相同的结果。
我想知道除了编写一些复杂的边缘情况处理之外是否有更简单/更智能的方法来解决这个问题(毕竟我们是程序员;谁不喜欢编写漂亮的代码并且优雅又花哨?)。 我说边缘案例处理是因为我的 49 个字符串中只有 6 个需要这种“特殊”行为。
到目前为止,我尝试过从 randint 调用中创建一个 lambda 函数,但这并没有帮助;同样的结果。 也许这是惰性评估的情况,但我需要一些关于如何(或是否?)将其与列表一起使用的指导。
请您参考如下方法:
如果您希望您的一些项目是文字的,但有些是可调用的,您可以创建您自己的list版本:
from random import randint
class LazyList(list):
'Like a list, but invokes callables'
def __getitem__(self, key):
item = super().__getitem__(key)
if callable(item):
item = item()
return item
fruits = LazyList([
"Orange",
"Banana",
lambda: f"{randint(2,5)} Cherries",
])
print(fruits[2])
print(fruits[2])
