import string
class FormatPlaceholder:
def __init__(self, key):
self.key = key
def __format__(self, spec):
result = self.key
if spec:
result += ":" + spec
return "{" + result + "}"
def __getitem__(self, index):
self.key = "{}[{}]".format(self.key, index)
return self
def __getattr__(self, attr):
self.key = "{}.{}".format(self.key, attr)
return self
class FormatDict(dict):
def __missing__(self, key):
return FormatPlaceholder(key)
def safe_format_alt(text, source):
formatter = string.Formatter()
return formatter.vformat(text, (), FormatDict(source))
print(safe_format_alt("{a[0].x[2]}", {}))
aW1wb3J0IHN0cmluZwoKCmNsYXNzIEZvcm1hdFBsYWNlaG9sZGVyOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGtleSk6CiAgICAgICAgc2VsZi5rZXkgPSBrZXkKICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIHNwZWMpOgogICAgICAgIHJlc3VsdCA9IHNlbGYua2V5CiAgICAgICAgaWYgc3BlYzoKICAgICAgICAgICAgcmVzdWx0ICs9ICI6IiArIHNwZWMKICAgICAgICByZXR1cm4gInsiICsgcmVzdWx0ICsgIn0iCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgogICAgICAgIHNlbGYua2V5ID0gInt9W3t9XSIuZm9ybWF0KHNlbGYua2V5LCBpbmRleCkKICAgICAgICByZXR1cm4gc2VsZgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgogICAgICAgIHNlbGYua2V5ID0gInt9Lnt9Ii5mb3JtYXQoc2VsZi5rZXksIGF0dHIpCiAgICAgICAgcmV0dXJuIHNlbGYKCgpjbGFzcyBGb3JtYXREaWN0KGRpY3QpOgogICAgZGVmIF9fbWlzc2luZ19fKHNlbGYsIGtleSk6CiAgICAgICAgcmV0dXJuIEZvcm1hdFBsYWNlaG9sZGVyKGtleSkKCgpkZWYgc2FmZV9mb3JtYXRfYWx0KHRleHQsIHNvdXJjZSk6CiAgICBmb3JtYXR0ZXIgPSBzdHJpbmcuRm9ybWF0dGVyKCkKICAgIHJldHVybiBmb3JtYXR0ZXIudmZvcm1hdCh0ZXh0LCAoKSwgRm9ybWF0RGljdChzb3VyY2UpKQoKcHJpbnQoc2FmZV9mb3JtYXRfYWx0KCJ7YVswXS54WzJdfSIsIHt9KSk=