Если я правильно понял ваш вопрос, вы хотите передать пользовательский словарь, который будет вычислять значения только при необходимости. Во-первых, мы ищем для реализации __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'
«' str.format() 'должен получить доступ только к ключу в ленивом запросе, который ему нужен.« Это * уже »делает это. Он делает * не * итерацию по всему словарю! – Bakuriu
@Bakuriu Но в случае '** d', конвертирует доступ ко всем элементам. – glglgl