簡體   English   中英

str.format()與懶惰的字典?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM