[英]str.format() with lazy dict?
我想使用str.format()
并传递一个自定义的懒惰字典。
str.format()
应该只访问它需要的惰性字典中的键。
这可能吗?
lazy_dict需要实现哪个接口?
更新
这不是我想要的:
'{0[a]}'.format(d)
我需要这样的东西:
'{a}'.format(**d)
需要在Python2.7上运行
对于做'{a}'.format(**d)
,尤其是**d
部分,“懒惰”字典被转换为常规字典。 这里发生了对所有键的访问,而format()
无法对它做任何事情。
您可以制作一些替代元素的代理对象,并在字符串访问时执行“真正的”工作。
就像是
class LazyProxy(object):
def __init__(self, prx):
self.prx = prx
def __format__(self, fmtspec):
return format(self.prx(), fmtspec)
def __repr__(self):
return repr(self.prx())
def __str__(self):
return str(self.prx())
您可以将这些元素放入dict中,例如
interd = { k, LazyProxy(lambda: lazydict[k]) for i in lazydict.iterkeys()}
我没有对此进行测试,但我认为这可以满足您的需求。
在最后一次编辑之后,它现在也适用于!r
和!s
。
您可以使用__format__
方法(仅限Python 3)。 请参阅此处的文档。
如果我正确理解您的问题,您希望传递一个自定义词典,该词典仅在需要时计算值。 首先,我们正在寻找__getitem__()
:
>>> class LazyDict(object):
... def __init__(self, d):
... self.d = d
... def __getitem__(self, k):
... print k # <-- tracks the needed keys
... return self.d[k]
...
>>> d = D({'a': 19, 'b': 20})
>>> '{0[a]}'.format(d)
a
'19'
这表明只访问了键'a'
; 'b'
不是,所以你已经有了懒惰的访问权限。
而且,任何对象属性是可用str.format
这种方式,并使用@property
装饰,您可以访问功能的结果:
class MyObject(object):
def __init__(self):
self.a = 19
self.b = 20
def __getitem__(self, var):
return getattr(self, var)
# this command lets you able to call any attribute of your instance,
# or even the result of a function if it is decorated by @property:
@property
def c(self):
return 21
用法示例:
>>> m = MyObject()
>>> '{0[c]}'.format(m)
'21'
但请注意,这也有效,使格式化字符串有点具体,但避免需要__getitem__()
实现。
>>> '{0.c}'.format(m)
'21'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.