Bases: str
Lazy format strings
An instance of LazyFormat behaves like a usual format string, except that the evaluation of the __repr__ method of the formated arguments it postponed until actual printing.
EXAMPLES:
Under normal circumstances, Lazyformat strings behave as usual:
sage: from sage.misc.lazy_format import LazyFormat
sage: LazyFormat("Got `%s`; expected a list")%3
Got `3`; expected a list
sage: LazyFormat("Got `%s`; expected %s")%(3, 2/3)
Got `3`; expected 2/3
To demonstrate the lazyness, let us build an object with a broken __repr__ method:
sage: class IDontLikeBeingPrinted(object):
... def __repr__(self):
... raise ValueError, "Don't ever try to print me !"
There is no error when binding a lazy format with the broken object:
sage: lf = LazyFormat("<%s>")%IDontLikeBeingPrinted()
The error only occurs upon printing:
sage: lf
...
ValueError: Don't ever try to print me !
Common use case:
Most of the time, __repr__ methods are only called during user interaction, and therefore need not be fast; and indeed there are objects x in Sage such x.__repr__() is time consuming.
There are however some uses cases where many format strings are constructed but not actually printed. This includes error handling messages in unittest or TestSuite executions:
sage: QQ._tester().assertTrue(0 in QQ,
... "%s doesn't contain 0"%QQ)
In the above QQ.__repr__() has been called, and the result immediately discarded. To demonstrate this we replace QQ in the format string argument with our broken object:
sage: QQ._tester().assertTrue(True,
... "%s doesn't contain 0"%IDontLikeBeingPrinted())
...
ValueError: Don't ever try to print me !
This behavior can induce major performance penalties when testing. Note that this issue does not impact the usual assert:
sage: assert True, “%s is wrong”%IDontLikeBeingPrinted()
We now check that LazyFormat indeed solves the assertion problem:
sage: QQ._tester().assertTrue(True,
... LazyFormat("%s is wrong")%IDontLikeBeingPrinted())
sage: QQ._tester().assertTrue(False,
... LazyFormat("%s is wrong")%IDontLikeBeingPrinted())
...
AssertionError: <unprintable AssertionError object>